又T又WA又RE,求助 dalao: 寄录
#include <cstring>
#include <iostream>
using namespace std;
int z[2000010];
void exkmp(string s, string p)
{
int n = s.size();
int m = p.size();
memset(z, 0, sizeof(z));
while (z[0] < m && z[0] < n && s[z[0]] == p[z[0]])
++z[0];
int l, r = 0;
for (int i = 1; i < m; ++i) {
if (i <= r)
z[i] = min(z[i - l + 1], r - i + 1);
while (i + z[i] < m && z[i] + 1 < n && p[i + z[i]] == s[z[i] + 1])
++z[i];
if (r < i + z[i] - 1) {
r = i + z[i] - 1;
l = i;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s, p;
cin >> s >> p;
exkmp(p, p);
long long ans = 0;
for (int i = 0; i < p.size(); ++i)
ans ^= 1ll * (i + 1) * (z[i] + 1);
cout << ans << '\n';
ans = 0;
exkmp(p, s);
for (int i = 0; i < s.size(); ++i)
ans ^= 1ll * (i + 1) * (z[i] + 1);
cout << ans;
return 0;
}