[POI2006] OKR-Periods of Words
思路
让前后缀相等的越少,减去的越少,这样周期越长
因此尝试递归求
怒交一发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;
}