P3435 [POI2006]OKR-Periods of Words(kmp)

#include<cstdio>
#include<iostream>
using namespace std;
const int N=1000005;
int n;
long long ans;
char s[N];
int nxt[N];
int main(){
	scanf("%d",&n);
	scanf("%s",s+1);
	int j=0;
	for(int i=2;i<=n;i++){
		while(j&&s[i]!=s[j+1]) j=nxt[j];
		if(s[i]==s[j+1]) j++;
		nxt[i]=j;
	}
	for(int i=1;i<=n;i++){
		j=i;
		while(nxt[j]) j=nxt[j];
		if(nxt[i]!=0) nxt[i]=j;
		ans+=i-j;
	}
	printf("%lld",ans);
	return 0;
}
posted @ 2021-11-18 23:13  dfydn  阅读(26)  评论(0编辑  收藏  举报