这道题跟POJ1961非常像,比那道还简单些,只需要求整个串就行,而1961需要求所有长度的。
题意是:
给一个串,求该串可以最多被一个子串重复多少次形成
比如abcabcabcabc,ans=4
方法不解释了,看看1961就行,还比那个省略不少
不过关键是要判断一下是否能被整除,如果不能,说明没有可用的子串,所以输出1
原题
Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 26833 | Accepted: 11233 |
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
Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
11773479 | chengtbf | 2406 | Accepted | 5060K | 94MS | C++ | 656B | 2013-07-13 09:12:44 |
代码:
#include<stdio.h>
#include<string.h>
#define N 1000005
char str[N];
int next[N];
int n;//字符串长度
void get_next()
{
int pos=2,cnd=0;
next[0]=-1;
next[1]=0;
while (pos<=n)
{
if (str[pos-1]==str[cnd])
{
cnd++;
next[pos]=cnd;
pos++;
}
else if(cnd>0)
{
cnd=next[cnd];
}
else
{
next[pos]=0;
pos++;
}
}
}
int main()
{
int i,l;
while (1)
{
char temp;
scanf("%s",&str);
scanf("%c",&temp);
if(str[0]=='.')break;
n=strlen(str);
get_next();
l=n-next[n];
if (n%l==0)
{
printf("%d\n",n/l);
}
else
{
printf("1\n");
}
}
return 0;
}