传送门:BZOJ1355(权限题)
显然[pre[len]+1..len]可作为一个循环串。
对于它是前缀的情况,以后缀拼接即可。
代码上的小细节见下。
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int pre[1000005];
char S[1000005];
int len;
void Make_Table(char* s)
{
pre[1]=0;int k=0;
for(int j=2;j<=len;j++){
while(k&&s[k+1]!=s[j])
k=pre[k];
if(s[k+1]==s[j])
k++;
pre[j]=k;
}
}
void Solve()
{
Make_Table(S);
printf("%d\n",len-pre[len]);
}
void Readdata()
{
freopen("loli.in","r",stdin);
scanf("%d\n",&len);
scanf("%s",S+1);
}
void Close()
{
fclose(stdin);
fclose(stdout);
}
int main()
{
Readdata();
Solve();
Close();
return 0;
}