unexpected problem

一个比较有趣的字符串问题,问题描述如下

大体意思就是给定一个字符串s以及一个整数m,找出一个能满足以上三个条件的字符串t的个数对10e9 + 7 取余输出。

第二三条是关键,t.s = s.t 举个例子 s = abab, t的话可以是ab。那么 t.s = ab(t)abab(s),s.t = abab(s)ab(t)。

t的长度要小于m。

例子:

一种大体思路就是判断s是否为由循环子字符构成的字符串,如abababab为子字符串ab循环构成的字符串。 如果是循环串,则找出子串的长度(len),如果不是则取s的长度(len)。 则(m/len)%10e9 + 7 即为所求。

一种判断是否为循环串的方法:

1.对s的长度进行因子分解

2.依次对因子进行遍历,按照因子长度对s进行截取,如果各子串都相同则记录因子跳出遍历,所找出的字符串即为所需。

#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <cstdio>

using namespace std;

int main(){
    string s,preStr;
    cin>>s;
    int len = s.length();
    vector<int> idx;
    vector<string> sub;
    //bool flag = true;
    for(int i = 1 ; i < len ; i++){
        if(len%i==0)
          idx.push_back(i);
    }
    int sz = idx.size();
    for(int i = 0; i < sz ; i++){
        int step = idx[i];
        preStr = s.substr(0,step);
        bool flag = true;
        for(int j = step; j < len/step ; j++){
            if(s.substr(idx[i]*j, idx[i]) != preStr)
            {
                flag = false;
                break;
            }
        }
        if(flag == true)
           break;
    }
    
    cout<<preStr.length()<<endl;

}

以上为找字符串串长度代码,可根据题目稍作修改即可。

 leaderboard上面一个比较简洁的代码,基本思想相同。


#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>


using namespace std;


int
main() { string s; long m; cin >> s >> m; for (int i = 1; i <= s.size(); i++) { if (s.size() % i != 0) continue; int j; for (j = i; j < s.size(); j++) { if (s[j] != s[j%i]) break; } if (j == s.size()) { cout << (m/i % (long)(1e9+7)) << endl; break; } } return 0; }
原文地址:https://www.cnblogs.com/klitech/p/5888314.html