[POI2006] OKR-Periods of Words

一道kmp好题

思路

让前后缀相等的越少,减去的越少,这样周期越长
因此尝试递归求
怒交一发T了
用dfs提前搜出所有答案,这样不会浪费时间

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int Max=1e6+10;

string s;
int nxt[Max],ans[Max]; 

int dfs(int x)
{
	if(nxt[x]==0) 
	{
		return x;
	}
	return ans[x]=dfs(nxt[x]);
}

signed main()
{
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    ios::sync_with_stdio(0);
	int n;
	cin>>n;
	cin>>s;
	s=" "+s;
	for(int i=2,j=0;i<=n;i++)
	{
		while(j&&s[j+1]!=s[i]) j=nxt[j];
		if(s[j+1]==s[i]) j++;
		nxt[i]=j;
	}

	int res=0;
	for(int i=n;i>=1;i--)
	{
		if(ans[i]) continue;
		ans[i]=dfs(i);
	}
	for(int i=1;i<=n;i++) res+=i-ans[i];
	cout<<res<<"\n";
    return 0;
}
posted @ 2022-02-13 12:11  juuich  阅读(28)  评论(0编辑  收藏  举报