1511: [POI2006]OKR-Periods of Words
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 351 Solved: 220[][][]Description
一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, 使得 A = PB. 如果 P A 并且 P 不是一个空串,那么我们说 P 是A的一个proper前缀. 定义Q 是A的周期, 当且仅当Q是A的一个proper 前缀并且A是QQ的前缀(不一定要是proper前缀). 比如串 abab 和 ababab 都是串abababa的周期. 串A的最大周期就是它最长的一个周期或者是一个空串(当A没有周期的时候), 比如说, ababab的最大周期是abab. 串abc的最大周期是空串. 给出一个串,求出它所有前缀的最大周期长度之和.
Input
第一行一个整数 k ( 1 k 1 000 000) 表示串的长度. 接下来一行表示给出的串.
Output
输出一个整数表示它所有前缀的最大周期长度之和.
Sample Input
8 babababa
Sample Output
24
直接求一下next,之后把所有的next向前找到最后一个非零地方的Next。
然后扫一遍对于每个next非零位置的周期来说就是i-new_next[i] 还是之前的那个性质,n-next[i]是最小循环周期,推一下就变成最长了。
1 #include2 #include 3 #include 4 #include 5 #include 6 7 #define ll long long 8 #define inf 1000000007 9 #define N 100000710 11 #define Wb putchar(' ')12 #define We putchar('\n')13 #define rg register int14 using namespace std;15 inline int read()16 {17 int x=0,f=1;char ch=getchar();18 while(!isdigit(ch)){ if(ch=='-')f=-1;ch=getchar();}19 while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}20 return x*f;21 }22 inline void write(ll x)23 {24 if(x<0) putchar('-'),x=-x;25 if (x==0) putchar(48);26 int num=0;char c[20];27 while(x) c[++num]=(x%10)+48,x/=10;28 while(num) putchar(c[num--]);29 }30 31 int n,t[N],f[N];32 ll ans;33 char s[N];34 35 void make_nxt()36 {37 t[0]=-1;38 for (rg i=0,j;i