给定两个字符串 a 和 b,我们定义 a×b为他们的连接。
例如,如果 a=abc
而 b=def
, 则 a×b=abcdef
。
如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=``(空字符串),=a×。
输入格式
输入包含不超过 1010 组测试样例,每组测试样例占一行。
每组样例包含一个由小写字母构成的字符串 ss,ss 的长度不超过 100100,且不包含空格。
最后的测试样例后面将是一个点号作为一行。
输出格式
对于每一个 s,你需要输出最大的 n,使得存在一个字符串 a,让 s=。
输入样例:
abcd
aaaa
ababab
.
输出样例:
1
4
3
/*字符串乘方的解题思路:
举例:当输入字符串"abababab"时,此时的n最大为4,可以发现,这一段字符串的长度与n的比值一定是整数,
也就是说,两者相除能除尽,像这种字符串就是符合字符串乘方的字符串。
字符串乘方,一定是一个短的字符串(最短为单个字符),复制n次后连接而成的一个字符串,例如"abababab"这种,
就是"ab"这个字符复制了n次后得到的,而乘号是连接多个字符的依据,并不是和整数运算那样的计算。
如果是"ababac"这种字符串,看起来好像有"ab"复制了两次,但是后面的ac是不同的,所以这个字符串的n最大只能是1。
所以思路是:先输入多个字符串,输入后,记录字符串的长度,通过len%n==0这个式子来判断是否有符合条件的乘方字符串,
找到符合条件的后,先把那个元字符串给找到,然后把这个元字符串复制n次,并连接起来,将此得到的字符串与输入的
符合条件的字符串作比较。如果相同的话,那么就直接输出这个结果n,应该没有不相同的情况,因为不相同的话是进不了
if语句的。
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string str;
while (cin >> str, str != ".")
//输入多个字符串。只知道要循环,却不知次数,就用while循环。
{
int len = str.size();//记录输入的字符串长度
for (int n = len; n; n--)
/*这个for循环是n直接从字符长度开始取值,当得到了符合条件的n时,自然也是最大的符合条件的
n值,所以从最大的依次运行排除,这样做是一石二鸟的。
这个for循环加与不加这一对中括号是不影响结果的,因为这个for循环里面只有这一个if语句,而且最后
得到结果后直接break跳出循环,根本不可能对结果造成影响,所以为了代码的简洁,可以去掉这一对
中括号。
这个for循环里面的n依次递减,直到得到了符合条件的n,才能进if语句,所以不用担心运行故障的问题。
*/
if (len % n == 0)
/*这是判断n是否符合条件的语句,当符合这条语句时,说明是乘方字符串,
就可以进入这里进行下面的操作。
*/
{
int b = len / n;
//得到元字符串的长度,为得到元字符串做铺垫。
string s = str.substr(0, b);
//利用substr函数在输入的字符串中截取元字符串长度的字符串,以此来得到元字符串。
string r;
/*定义一个结果字符串,将得到的元字符串复制n次,得到的结果与原字符串比较,
如果相等就输出此时的结果n。
*/
for (int i = 0; i < n; i++)
r += s;//这是复制连接的过程。
if (r == str)//判断两者是否相等的过程。
{
cout << n << endl;
return 0;
/*最后得到结果后就结束程序,不然会让这循环继续运行,得到一些不要或者是错误的答案。
相当于说满足所有条件,得到最后结果的那个字符串,就结束那一趟。输入多少个字符串就有多少
趟,结束程序并不是指后续不能输入了,而是那一趟而已。
*/
}
}
}
return 0;
}