字符串乘方

给定两个字符串 a 和 b,我们定义 a×b为他们的连接。

例如,如果 a=abc 而 b=def, 则 a×b=abcdef

如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=``(空字符串),{a}^{(n+1)}=a×({a}^{n})

输入格式

输入包含不超过 1010 组测试样例,每组测试样例占一行。

每组样例包含一个由小写字母构成的字符串 ss,ss 的长度不超过 100100,且不包含空格。

最后的测试样例后面将是一个点号作为一行。

输出格式

对于每一个 s,你需要输出最大的 n,使得存在一个字符串 a,让 s={a}^{n}

输入样例:
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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值