[POI2006]OKR-Periods of Words
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<stack> 10 #include<vector> 11 using namespace std; 12 typedef long long ll; 13 const int maxn=1e6+7; 14 int n; 15 int nxt[maxn]; 16 ll ans; 17 char s[maxn]; 18 int main(){ 19 cin>>n;scanf("%s",s); 20 int j=0; 21 for(int i=1;i<n;i++){ 22 while(s[i]!=s[j]&&j>0) j=nxt[j]; 23 if(s[i]==s[j]) j++; 24 nxt[i+1]=j; 25 } 26 for(int i=1;i<=n;i++){ 27 j=i; 28 while(nxt[j]>0) j=nxt[j]; 29 if(nxt[i]!=0) nxt[i]=j; 30 ans+=i-j; 31 } 32 cout<<ans<<endl; 33 return 0; 34 }