[POJ 2406]Power Strings(kmp)
2017-08-16 10:22
344 查看
点击打开题目
Power Strings
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
Sample Output
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source
Waterloo local 2002.07.01
题意:就是问一个字符串写成(a)^n的形式,求最大的n.
题解:根据KMP的next函数的性质,已知字符串t第K个字符的next[k],那么d=k-next[k],如果k%d==0,那么t[1……k]最多可均匀的分成k/d份。也就是可以生成一个长度为d的重复度为k/d的字串。
代码:
Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 50554 | Accepted: 21087 |
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
abcd aaaa ababab .
Sample Output
1 4 3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source
Waterloo local 2002.07.01
题意:就是问一个字符串写成(a)^n的形式,求最大的n.
题解:根据KMP的next函数的性质,已知字符串t第K个字符的next[k],那么d=k-next[k],如果k%d==0,那么t[1……k]最多可均匀的分成k/d份。也就是可以生成一个长度为d的重复度为k/d的字串。
代码:
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; const int MAX=1e6+10; char s[MAX]; char t[MAX]; int Next[MAX]; int n,m; int ans=0; void getNext(){ int i=0,j=0; Next[0]=-1; j=Next[i]; while(i<m){ if(j==-1||t[i]==t[j]){ i++; j++; Next[i]=t[i]==t[j]?Next[j]:j; } else{ j=Next[j]; } } } int main(){ while(~scanf("%s",t)){ if(t[0]=='.') break; m=strlen(t); getNext(); ans=1;//最小是1,不初始化会WA if(m%(m-Next[m])==0)//判断是否能整除
ans=m/(m-Next[m]);
cout<<ans<<endl; } return 0; }
相关文章推荐
- poj 2406 Power Strings(KMP || 暴力)
- 【kmp+最小循环节】poj 2406 Power Strings
- POJ 2406 Power Strings(kmp)
- Power Strings POJ 2406【KMP Next的应用】
- POJ 2406 Power Strings(KMP)
- POJ 2406 Power Strings (kmp求循环节)
- POJ -2406 Power Strings(循环节,kmp专题)
- poj 2406 Power Strings(KMP轮回串)
- POJ - 2406 Power Strings解题报告(KMP,字符串划分成若干连续相同子串)
- POJ 2406 Power Strings [KMP+循环节]
- POJ 2406 - Power Strings(KMP)
- poj 2406 Power Strings(KMP)
- POJ 2406 Power Strings(KMP:找串循环节)
- POJ 2406 Power Strings(KMP)
- POJ_2406_Power Strings[KMP]
- poj2406 Power Strings 【KMP】
- POJ-2406 Power Strings(KMP求重复子串出现的最大次数)
- POJ 2406 Power Strings kmp求循环结
- poj 2406 Power Strings (kmp)
- POJ -2406 power strings --KMP中next函数的应用