/*
* poj 2406 Power Strings
题目大意:
周期串。定义字符串a的n次幂为aa..a(n个a串联起来)。给定字串,输出最大n值。
解题思路:
采用KMP算法中的前缀算法计算方法,计算出尾字符处的Pi值l,串长m-l可以被m
整除的话,该串为周期串,n=m/(m-l)。如果不可整除,该串非周期串,n=1
数学模型:
引理:
(m-l)能被m整除,是串s周期串的充分必要条件。
证明:
必要性: 如果s是周期串,则m-l必然是最小周期的长度,所以(m-l)能被m整除。
充分性:
假设k=m/(m-l),将原串划分成k个串,s1,s2,..sk
根据KMP前缀串算法的定义,有:
s1=s2
s2=s3
...
s(k-1)=sk
由上可得,s1=s2=..=sk,所以s是周期串,最小周期是m-l
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
namespace {
using namespace std;
const int N_MAX = 1000000;
int Pi[N_MAX];
char s[N_MAX];
}
int main()
{
while (EOF!=scanf("%s", s) && s[0]!='.')
{
int m=1;
Pi[0]=-1;
int q=-1;
for (int i=1; s[i]!='\0'; i++)
{
m++;
while (q!=-1 && s[q+1]!=s[i])
{
q = Pi[q];
}
if (s[q+1]==s[i])
{
q += 1;
}
Pi[i] = q;
}
if (0 == m%(m-1-Pi[m-1]))
printf("%d\n", m/(m-1-Pi[m-1]));
else
printf("1\n");
}
return 0;
}
poj 2406 Power Strings
最新推荐文章于 2024-10-08 20:32:22 发布