KMP
next函数

const int N=1e6+10,mod=998244353,inf=1e15;
int nxt[N];
string s1,s2;
void solve()
{cin>>s1>>s2;int n1=s1.size(),n2=s2.size();s1=' '+s1;s2=' '+s2;nxt[1]=0;for(int i=2,j=0;i<=n2;i++){while (j&&s2[i]!=s2[j+1])j=nxt[j];if(s2[i]==s2[j+1])j++;nxt[i]=j;}for(int i=1,j=0;i<=n1;i++){while (j&&s1[i]!=s2[j+1])j=nxt[j];if(s1[i]==s2[j+1])j++;if(j==n2){cout<<i-n2+1<<endl;}}forr(j,1,n2)cout<<nxt[j]<< ';cout<<endl;
}
扩展KMP

const int N=2e7+10,mod=1e9+9,inf=1e9+10;
int z[N],p[N];
int get_z(string s,int n){z[1]=n;int l=0,r=0;forr(i,2,n){if(i<=r)z[i]=max(0ll,min(z[i-l+1],r-i+1));while(s[1+z[i]]==s[i+z[i]])z[i]++;if(i+z[i]-1>r)l=i,r=i+z[i]-1;}int wz=0;forr(i,1,n){wz^=(1ll*i*(z[i]+1));}return wz;
}
int exkmp(string s,string t,int n,int m){int l=0,r=0;forr(i,1,m){if(i<=r)p[i]=max(0ll,min(z[i-l+1],r-i+1));while(1+p[i]<=n&&i+p[i]<=m&&s[1+p[i]]==t[i+p[i]])p[i]++;if(i+p[i]-1>r)l=i,r=i+p[i]-1;}int wz=0;forr(i,1,m){wz^=(1ll*i*(p[i]+1));}return wz;
}
void solve(){string a,b;cin>>a>>b;int an=a.size(),bn=b.size();a=' '+a,b=' '+b;cout<<get_z(b,bn)<<endl;cout<<exkmp(b,a,bn,an)<<endl;
}