AcWing 777. 字符串乘方

发布时间 2023-05-09 10:56:26作者: gao79138

AcWing 777. 字符串乘方


1. 地址

    https://www.acwing.com/problem/content/779/

2. 题解

#include <iostream>
#include <cstdio>

using namespace std;

/*
    算法思路:
        通过本题性质,我们可以发现:
            1. 子串长度*n = 主串长度,既然这里要求最大的n,那么我们可以循环遍历n,看看主串长度能否可以整除n。
            2. n的范围最大不超过主串长度,最小就是1,此时子串就等于主串。
            3. 找到n之后,根据上述公式,我们可以得到子串长度。
            4. 由于主串有多个子串拼接n次得到,那么主串的前子串长度所代表的子串一定跟子串相等。
            5. 所以,根据第4点,我们可以根据子串长度取得主串的一部分作为子串。
            6. 然后,再让子串拼接n次得到新的主串。
            7. 如果新的主串跟原主串相等,那么该子串符合题目要求,n也是最大的。(因为n从大到小遍历)
            8. 如果不等,那么子串不符合题目要求,同时n也不符合题目要求。
*/

int main(){
    string str;
    while(cin >> str, str != "."){
        int len = str.size();   //主串长度
        //遍历n
        for(int n = len; n>=1 ;n--){
            if(len % n == 0){
                int length = len / n;   //子串长度
                //取子串
                string r = str.substr(0,length);
                string new_str = "";
                //组合新的主串
                for(int i=0;i<n;i++){
                    new_str += r;
                }
                if(new_str == str){
                    cout << n << endl;
                    break;
                }
            }
        }
    }
    return 0;
}