777.字符串乘方
题目描述
给定两个字符串a和b,我们定义a*b为他们的连接。
例如,如果a=”abc” 而b=”def”, 则a*b=”abcdef”。
如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0 = ””(空字符串),a(n+1)=a∗a(n)。
输入格式
输入包含多组测试样例,每组测试样例占一行。
每组样例包含一个字符串s,s的长度不超过100。
最后的测试样例后面将是一个点号作为一行。
输出格式
对于每一个s,你需要输出最大的n,使得存在一个字符串a,让s = an。
输入样例:
abcd
aaaa
ababab
.
输出样例:
1
4
3
难度:困难 |
---|
时/空限制:1s / 64MB |
总通过数:65 |
总尝试数:90 |
来源:语法题 |
算法标签:字符串 |
AC代码
#include<cstdio>
#include<cstring>
char s[105];
int next[105];
int len;
void getnext() //kmp算法
{
int i = 0;
int j = -1;
next[0] = -1;
while(i < len){
if(j == -1 || s[i] == s[j]){
i ++; j ++;
next[i] = j;
}
else{
j = next[j];
}
}
}
int main(void)
{
while(scanf("%s",&s)){
if(s[0] == '.'){
break;
}
len = strlen(s);
getnext();
if(len % (len-next[len]) == 0) //== 0 说明已经找到了最长的可重复字符串
printf("%d\n",len / (len-next[len])); //输出这个找到的字符串出现的次数
else
printf("1\n"); //否则说明这个字符串就是要找的那个字符串即答案为1
}
return 0;
}