unexpected problem

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

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。

例子:

unexpected problem

一种大体思路就是判断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 = ; i < len ; i++){
if(len%i==)
idx.push_back(i);
}
int sz = idx.size();
for(int i = ; i < sz ; i++){
int step = idx[i];
preStr = s.substr(,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 = ; i <= s.size(); i++) {
if (s.size() % i != ) 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+)) << endl;
break;
}
} return ;
}
上一篇:jQuery基础 (一)——样式篇(认识jQuery)


下一篇:【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)