标签:pow 一个 abc efault 文件 == code target poj2406
★☆ 输入文件:powerstrings.in
输出文件:powerstrings.out
简单对比
时间限制:3 s 内存限制:256 MB
对于给定的两个字符串a,b,我们定义a*b是将把它们连接在一起形成的字符串。例如,若a="abc",b="def",则a*b="abcdef"。如果我们将这种运算视为乘法,则非负整数的乘方运算被以类似的方式定义:a^0=""(空字符串),a^(n+1)=a*(a^n)。
输入包含多组数据。
每组数据有一行一个大写字母组成的字符串s,其长度至少为1,至多为10^6.输入结束标志为一行一个“.”(半角句号)。
输出使得存在某个a,使得a^n=s的最大n。
ABCD AAAA ABABAB .
1 4 3
输入文件可能很大,请使用scanf代替cin以避免超时。
还是不会巧方法。。
其实观察一下next数组就发现他的神奇。。
(1)若2*next[len] < len 则最小重复单元长度为len那么他重复次数为1
(2)若2*next[len] > len 则:
1>:如果len%(len-next[len]) == 0则最小重复单元长度为len - next[len],那么其重复次数为len/(len-next[len]).
2>:如果len%(len - next[len]) != 0 则最小重复单元长度为:len,那么其重复次数为1
#include <cstring> #include <cstdio> #define N 1000005 char str[N]; int Next[N]; void Get_next(int ln) { int i=0,j=-1; Next[i]=j; for(;i<ln;) { if(j==-1||str[i]==str[j]) i++,j++,Next[i]=j; else j=Next[j]; } } int main() { for(;1;) { scanf("%s",str); if(str[0]==‘.‘) break; int len=strlen(str); Get_next(len); /* for(int i=1;i<=len;i++) printf("%d ",Next[i]); printf("\n");*/ if(2*Next[len]<len) printf("1\n"); else { if(len%(len-Next[len])==0) printf("%d\n",len/(len-Next[len])); else printf("1\n"); } } return 0; }
标签:pow 一个 abc efault 文件 == code target poj2406
原文地址:http://www.cnblogs.com/ruojisun/p/7384211.html