KMP
1 #include<cstring> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=2000; 6 char a[maxn+50],s[maxn+50]; 7 int next[maxn+50][maxn+50]; 8 int len1,len,t; 9 int main() 10 { 11 scanf("%d\n",&t); 12 while(t--) 13 { 14 s[0]='0'; 15 scanf("%s",s+1); 16 len=strlen(s); 17 for(int k=1;k<len;++k) 18 { 19 int j=k-1; 20 next[k][k]=k-1; 21 for(int i=k+1;i<len;++i) 22 { 23 while(j>=k&&s[j+1]!=s[i]) j=next[k][j]; 24 if(s[j+1]==s[i]) ++j; 25 next[k][i]=j; 26 } 27 } 28 long long ans=0; 29 for(int k=1;k<len;++k) 30 { 31 int j=k-1; 32 for(int i=1;i<len;++i) 33 { 34 while(j>=k&&s[j+1]!=s[i]) j=next[k][j]; 35 if(s[j+1]==s[i]) ++j; 36 ans^=1LL*(i-(j-k+1))*(j-k+1)*(j-k+1)*(len-1-j); 37 if(j==len-1) j=next[k][j]; 38 } 39 } 40 printf("%lld\n",ans); 41 } 42 return 0; 43 }