Power Strings
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 48557 Accepted: 20207
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
abcd
aaaa
ababab
.
Sample Output
1
4
3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
题意:给你一个字符串a,问a最多由几个完全相同的子串连接而成
做法:若存在这样的连接则连接数为n/(n-next[n-1])
若不存在则这个式子不会是一个整数,那么输出1就好了。
代码如下:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
char a[2000000];
int p[2000000];
int main()
{
while (scanf("%s",&a)>0)
{
if (a[0]=='.') return 0;
p[0]=-1;
int j=-1;
int m=strlen(a);
for (int i=1;i<=m-1;i++)
{
while (j>-1&&a[j+1]!=a[i]) j=p[j];
if (a[j+1]==a[i]) j++;
p[i]=j;
}
if (m%(m-p[m-1]-1)!=0) cout<<1<<endl;
else if (m%(m-p[m-1]-1)==0) cout<<m/(m-p[m-1]-1)<<endl;
}
}