POJ 2046 Power Strings KMP(next数组应用)
2015-03-01 13:15
309 查看
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
长知识了这回,没想到next[len]是本题的关键,以前总是以为next访问不到len,算了一下,还真能访问到,这回赚了。。。。。
#include <stdio.h>
#include <string.h>
char s[1000010];
int next[1000010];
void getnext(int len)
{
int i = 0,j = -1;
next[i] = j;
while(i < len)
{
if(j == -1 || s[i] == s[j])
{
i++;
j++;
if(s[i] != s[j])
next[i] = j;
else
next[i] = next[j];
// next[i] = j;也是可以的
}
else
j = next[j];
}
}
int main()
{
while(scanf("%s",s),strcmp(".",s))
{
int len = strlen(s);
getnext(len);
if(len % (len - next[len]) == 0)
printf("%d\n",len / (len - next[len]));
else
printf("1\n");
}
return 0;
}
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 34646 | Accepted: 14338 |
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
长知识了这回,没想到next[len]是本题的关键,以前总是以为next访问不到len,算了一下,还真能访问到,这回赚了。。。。。
#include <stdio.h>
#include <string.h>
char s[1000010];
int next[1000010];
void getnext(int len)
{
int i = 0,j = -1;
next[i] = j;
while(i < len)
{
if(j == -1 || s[i] == s[j])
{
i++;
j++;
if(s[i] != s[j])
next[i] = j;
else
next[i] = next[j];
// next[i] = j;也是可以的
}
else
j = next[j];
}
}
int main()
{
while(scanf("%s",s),strcmp(".",s))
{
int len = strlen(s);
getnext(len);
if(len % (len - next[len]) == 0)
printf("%d\n",len / (len - next[len]));
else
printf("1\n");
}
return 0;
}
相关文章推荐
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
- poj 2406 Power Strings[kmp,next数组的应用]
- poj 2406 Power Strings KMP的next数组的应用
- POJ 2406 Power Strings (KMP next数组应用)
- poj 2406 Power Strings(kmp next数组的应用)
- POJ 2406 Power Strings 1961的简化版,kmp的next数组的应用
- POJ 2406 Power Strings next数组循环节应用、
- POJ-Power Strings(next数组应用)
- 【next数组应用】POJ 2406 Power Strings
- Power Strings POJ 2406【KMP Next的应用】
- POJ2406 Power Strings(KMP next数组的运用)
- POJ - 2406_Power Strings _kmp算法next数组的应用
- POJ 2406 Power Strings(next数组应用)
- 【POJ2406】Power Strings-KMP中next数组的应用
- POJ 2406 Power Strings (kmp next数组)
- POJ 2406-Power Strings(重复子串-KMP中的next数组)
- poj 2406:Power Strings(KMP算法,next[]数组的理解)
- poj2752—kmp的next数组的简单应用
- poj 1961 Period (kmp next 数组的应用)
- POJ 2752 Seek the Name, Seek the Fame(KMP next数组应用)