一个比较有趣的字符串问题,问题描述如下
大体意思就是给定一个字符串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; }