#include<iostream>
#include<string>
using namespace std;
const int cap=2e7+10;
long long Next[cap],extend[cap];
void getNext(string b)
{
int p=0,a=0;
Next[0]=b.size();
for(int i=1;i<b.size();i++)
{
if(i>=p||i+Next[i-a]>=p)//i>=p为什么? 表示一种未知需要去匹配的情况,p是必须要在i的前面的,现实也是如此
{
if(i>=p)
p=i;
while(p<b.size()&&b[p]==b[p-i])
p++;
Next[i]=p-i;
a=i;
}
else
Next[i]=Next[i-a];
}
}
void getExtend(string aa,string b)
{
int a=0,p=0;
getNext(b);
for(int i=0;i<aa.size();i++)
{
if(i>=p||i+Next[i-a]>=p)
{
if(i>=p)
p=i;
while(p<aa.size()&&p-i<b.size()&&aa[p]==b[p-i])
p++;
extend[i]=p-i;
a=i;
}
else
extend[i]=Next[i-a];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
string a,b;
cin>>a>>b;
getExtend(a,b);
long long ans=0;
for(int i=0;i<b.size();i++)
ans^=(i+1)*(Next[i]+1);
cout<<ans<<endl;
ans=0;
for(int i=0;i<a.size();i++)
ans^=(i+1)*(extend[i]+1);
cout<<ans<<'\n';
return 0;
}
扩展kmp模板
最新推荐文章于 2024-11-02 20:20:37 发布
该博客主要介绍了如何实现KMP算法,包括getNext和getExtend两个关键函数,用于计算Next数组和extend数组。通过这两个数组,可以高效地进行字符串匹配。在主函数中,使用这两个数组计算了特定字符串的匹配特性,并输出了相关结果。
摘要由CSDN通过智能技术生成