2 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N= 1e6 + 10; char sa[N], sb[N]; int lena, lenb; LL p[N], z[N]; void get_z() { memset(z, 0, sizeof(z)); z[1] = lenb; for (int i = 2, l = 0, r = 0; i <= lenb; i ++) { if (i <= r) { z[i] = min(z[i - l + 1], 1LL * (r - i + 1)); } while (1 + z[i] <= lenb && i + z[i] <= lenb && sb[1 + z[i]] == sb[i + z[i]]) { z[i] ++; } if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; } } } void get_p() { memset(p, 0, sizeof(p)); for (int i = 1, l = 0, r = 0; i <= lena; i ++) { if (i <= r) { p[i] = min(z[i - l + 1], 1LL * (r - i + 1)); } while (i + p[i] <= lena && 1 + p[i] <= lenb && sa[i + p[i]] == sb[1 + p[i]]) { p[i] ++; } if (i + p[i] - 1 > r) { l = i; r = i + p[i] - 1; } } } int main () { ios::sync_with_stdio(false); cin.tie(0); cin >> sa + 1 >> sb + 1; lena = strlen(sa + 1); lenb = strlen(sb + 1); get_z(); get_p(); for (int i = 1; i <= lena; i ++) { cout << p[i] << " "; } cout << "\n"; return 0; } -
0
#include<bits/stdc++.h> using namespace std;
</p>typedef long long LL; const int N= 1e6 + 10; char sa[N], sb[N]; int lena, lenb; LL p[N], z[N];
void get_z() { memset(z, 0, sizeof(z)); z[1] = lenb;
for (int i = 2, l = 0, r = 0; i <= lenb; i ++) { if (i <= r) { z[i] = min(z[i - l + 1], 1ll * (r - i + 1)); } while (1 + z[i] <= lenb && i + z[i] <= lenb && sb[1 + z[i]] == sb[i + z[i]]) { z[i] ++; } if (i + z[i] - 1 > r) { l = i; r = i + z[i] - 1; } }}
void get_p() { memset(p, 0, sizeof(p));
for (int i = 1, l = 0, r = 0; i <= lena; i ++) { if (i <= r) { p[i] = min(z[i - l + 1], 1ll * (r - i + 1)); } while (i + p[i] <= lena && 1 + p[i] <= lenb && sa[i + p[i]] == sb[1 + p[i]]) { p[i] ++; } if (i + p[i] - 1 > r) { l = i; r = i + p[i] - 1; } }}
int main () { ios::sync_with_stdio(False); cin.tie(0);
cin >> sa + 1 >> sb + 1; lena = strlen(sa + 1); lenb = strlen(sb + 1); get_z(); get_p(); for (int i = 1; i <= lena; i ++) { cout << p[i] << " "; } cout << "\n"; return 0;}
- 1
信息
- ID
- 577
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 49
- 已通过
- 21
- 上传者