poj 2406

来源:互联网 发布:专升本c语言考试大纲 编辑:程序博客网 时间:2024/05/21 10:57

题目链接:http://poj.org/problem?id=2406

Description

Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

Input

Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

Output

For each s you should print the largest n such that s = a^n for some string a.

Sample Input

abcdaaaaababab.

Sample Output

1

4

3

题意:求子串的循环次数

解决方法:KMP中的覆盖函数

参考文章:http://www.cppblog.com/suiaiguo/archive/2009/07/16/90237.html            

AC code:

#include<stdio.h>#include<iostream>#include<cstring>#define M 1000008int next[M];char str[M];int length;void get_next(){int i=0,j=-1;next[0]=-1;while(i<length){ if(j==-1||str[i]==str[j]) {++i;++j;next[i]=j; } else j=next[j];}}int main(){while(scanf("%s",str),str[0]!='.'){length=strlen(str);get_next();int n=length-next[length];             //此为循环节的长度if(next[length]!=0&&length%n==0)printf("%d\n",length/n);elseprintf("1\n");}}

附上变式poj 1961 AC code:

#include<iostream>#include<stdio.h>using namespace std;#define M 1000008int next[M];char str[M];int num;void get_next(){int i=-1;int j=0;next[0]=-1;while(j<num){if(i==-1||str[i]==str[j]){++i;++j;next[j]=i;}elsei=next[i];}}int main(){int t=0;while(scanf("%d",&num),num){  int i,temp;  for(i=0;i<num;++i)  cin>>str[i];  get_next();  printf("Test case #%d\n",++t);  for(i=1;i<=num;++i)  {temp=i-next[i];if(i%temp==0&&i!=temp)printf("%d %d\n",i,i/temp);      }      printf("\n");}}