没发现代码死在哪了,打表出来的 lcp 和 z 数组的值也一样,但是寄了
#include <bits/stdc++.h>
const int N = 2e7 + 10;
using namespace std;
inline int read()
{
int t;
cin >> t;
return t;
}
int n, z[N], ans1, ans2, lcp[N], m;
char str[N], ch[N];
inline void Z()
{
z[1] = n;
for(int i = 2, r = 0, l = 1;i <= n;i = -~i)
{
if(i <= r) z[i] = min(z[i - l + 1], r - i + 1);
while(i + z[i] <= n && str[z[i] + 1] == str[z[i] + i]) ++ z[i];
if(i + z[i] - 1 > r) r = i + z[i] - 1, l = i;
}
}
inline void exkmp()
{
for(int i = 1, l = 1, r = 0;i <= m;i = -~i)
{
if(i <= r) lcp[i] = min(lcp[i - l + 1], r - i + 1);
while(i + lcp[i] <= m && str[lcp[i] + 1] == ch[lcp[i] + i]) ++ lcp[i];
if(i + lcp[i] - 1 > r) r = i + lcp[i] - 1, l = i;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> ch + 1 >> str + 1;
n = strlen(str + 1);
m = strlen(ch + 1);
Z();
for(int i = 1;i <= n;i = -~i) ans1 ^= i * (z[i] + 1);
exkmp();
for(int i = 1;i <= m;i = -~i) ans2 ^= i * (lcp[i] + 1);
cout << ans1 << endl << ans2 << endl;
return 0;
}