Just A String(kmp应用)
题解:枚举后缀,然后按照kmp匹配的模板题去匹配所有的前缀,用col[]数组来存最长的匹配成功的公共部分:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=2005;
char s[maxn];
int nxt[maxn];
int col[maxn];
int n;
void getnext(char str[maxn])
{
int i=1,j=0;
int len=strlen(str+1);
//printf("len:%d\n",len);
while(i<=len){
if(j==0||str[i]==str[j]){
i++;
j++;
nxt[i]=j;
}
else{
j=nxt[j];
}
}
}
void kmp(char s1[maxn],char s2[maxn])
{
getnext(s2);
int len1=strlen(s1+1);
int len2=strlen(s2+1);
int j=1;
for(int i=1;i<=len1;i++){
while(j&&s1[i]!=s2[j]){
j=nxt[j];
}
if(j==0){
col[i]=0;
}
else{
col[i]=j;
}
j++;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%s",s+1);
n=strlen(s+1);
LL res=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
col[j]=0;
}
kmp(s,s+n-i);
for(int j=1;j<=n;j++){
LL A=j-col[j];
LL B=col[j];
LL C=i-col[j];
LL pre=A*B*B*C;
res^=pre;
}
}
printf("%lld\n",res);
}
return 0;
}