我的代码改了很久,还是不对。
所有报错都在第二行,也就是扩展KMP数组有问题,请帮忙找一下错误,谢谢!
原题链接:扩展KMP
代码如下:
#include <bits/stdc++.h>
using namespace std;
string s1,s2;
long long nxt[20000001],exkmp[20000001];
int main()
{
cin>>s1>>s2;
//nxt[i]:s2本身与以s2[i]开头的s2的后缀的LCP(最长公共前缀)
nxt[0]=s2.size();
int k=1,p,l;
for(int i=0;i+1<s2.size();i++)
{
if(s2[i]==s2[i+1])
nxt[1]++;
else break;
}
for(int i=2;i<s2.size();i++)
{
p=k+nxt[k]-1;
l=nxt[i-k];
if(l<=(p-i+1)-1)
{
nxt[i]=l;
}
else
{
int j;
for(j=max(0,p-i+1);j+i<s2.size();j++)
{
if(s2[j]!=s2[j+i])
break;
}
nxt[i]=j;
k=i;
}
}
//exkmp:s2本身与以s1[i]开头的s1的后缀的LCP(最长公共前缀)
k=1;
for(int i=0;i<s2.size()&&i<s1.size();i++)
{
if(s2[i]==s1[i])
exkmp[0]++;
else
break;
}
for(int i=1;i<s1.size();i++)
{
p=k+exkmp[k]-1;
l=exkmp[i-k];
if(l<=(p-i+1)-1)
{
exkmp[i]=l;
}
else
{
int j;
for(j=max(0,p-i+1);j+i<s1.size()&&j<s2.size();j++)
{
if(s2[j]!=s1[j+i])
break;
}
exkmp[i]=j;
k=i;
}
}
//ans
long long ans=0;
for(int i=0;i<s2.size();i++)
ans^=(i+1)*(nxt[i]+1);
printf("%lld\n",ans);
ans=0;
for(int i=0;i<s1.size();i++)
ans^=(i+1)*(exkmp[i]+1);
printf("%lld",ans);
return 0;
}