总时间限制: 3000ms 内存限制: 65536kB
描述
给定两个字符串a和b,我们定义ab为他们的连接。例如,如果a=”abc” 而b=”def”, 则ab=”abcdef”。 如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义: a 0 a^0 a0=””(空字符串), a ( n + 1 ) a^{(n+1)} a(n+1)= a ∗ ( a n ) a*(a^n) a∗(an)。
输入
每一个测试样例是一行可打印的字符作为输入,用s表示。s的长度至少为1,且不会超过一百万。最后的测试样例后面将是一个点号作为一行。
输出
对于每一个s,你应该打印最大的n,使得存在一个a,让s=a^n
样例输入
abcd
aaaa
ababab
.
样例输出
1
4
3
提示
本问题输入量很大,请用scanf代替cin,从而避免超时。
来源
Waterloo local 2002.07.01
思路(最无赖的办法)
首先,我们要弄清楚一个事实,就是奇数情况下,结果直接为1
,因为在长度小于输入的字符串的长度的情况下,根本找不到一个适重合的部分。
然后,一旦发现存在不重复的现象,即*p != *q
,sufferLen
直接为0
,p
要放回到s
的位置上,至于q
,他得向前看,因为现在无法匹配的上,不代表以后不能匹配得上。
如果匹配得上则是sufferLen = q - p
。
然后就是考虑字符串长度是否能被sufferLen
整除了。
Code
#include <bits/stdc++.h>
using namespace std;
char *s = (char*)malloc(sizeof(char)*10000006);
int main() {
while(scanf("%s", s) && s[0] != '.') {
int res, sufferLen = 0;
if(strlen(s) % 2 == 0) {
for(char *p = s, *q = s+1; *q; ++q) {
if(*p == *q) {
sufferLen = q - p;
++p;
} else {
p = s;
sufferLen = 0;
}
}
if(sufferLen == 0) sufferLen = strlen(s);
res = strlen(s)/sufferLen;
if(strlen(s) % sufferLen == 0) cout << res << endl;
else cout << "1" << endl;
} else cout << "1" << endl;
}
}