给一个字符串,问每个字串的循环节位置在哪里并且循环了几次
KMP模板题,众所周知i−next[i]i−next[i]的含义就是字符串前ii个字符循环节大小
#include <bits/stdc++.h>
using namespace std;
#define ls st<<1
#define rs st<<1|1
#define fst first
#define snd second
#define MP make_pair
#define PB push_back
#define LL long long
#define PII pair<int,int>
#define VI vector<int>
#define CLR(a,b) memset(a, (b), sizeof(a))
#define ALL(x) x.begin(),x.end()
#define rep(i,s,e) for(int i=(s); i<=(e); i++)
#define tep(i,s,e) for(int i=(s); i>=(e); i--)
const int INF = 0x3f3f3f3f;
const int MAXN = 2e6+10;
const int mod = 1e9+7;
const double eps = 1e-8;
bool flag;
int nxt[MAXN];
int ans;
int n, m;
int arr[MAXN], brr[MAXN];
string s;
void kmp(string p) {
int res = 0;
int i = 0, j = nxt[0] = -1;
int len_p = p.size();
while(i < len_p) {
while(j!=-1 && p[i]!=p[j])
j = nxt[j];
nxt[++i] = ++j;
}
return;
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int n, kk = 0;
while(cin >> n, n) {
cin >> s;
kmp(s);
int len = s.size();
kmp(s);
cout << "Test case #" << ++kk << endl;
for(int i = 0; i <= s.size(); i++) {
if(nxt[i]==-1 || nxt[i]==0)
continue;
int x = i-nxt[i];
if(i%x==0) {
cout << i << " " << i/x << endl;
}
}
cout << "\n";
}
return 0;
}