标签:cond 长度 std cstring string 选择 queue ret while
给你一个字符串,让你判断这个字符串的前缀是不是由一个字串重复而组成的,如果有求出所有前缀串的长度和重复次数。
因为重复这个概念我们在kmp算法里面提到过,next数组,有印象么,那么根据后缀函数的定义我们把这个串往后移,错位部分的长度就等于i-f[i],f数组就相当于与kmp里面的next数组,因为我们所选择的这个数组前缀要由这个重复的部分组成,那么我们可以知道,如果i%(i-f[i])==0那么这个长度的前缀就符合题意。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <numeric>
#include<vector>
#include <functional>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int maxn=1000000+10;
char p[maxn];
int f[maxn];
int main() {
int n,kcase=0;
while (cin>>n&&n) {
cin>>p;
f[0]=f[1]=0;
for (int i=1;i<n;i++) {
int j=f[i];
while (j&&p[i]!=p[j]) j=f[j];
f[i+1]=p[i]==p[j]?j+1:0;
}
printf ("Test case #%d\n",++kcase);
for (int i=2;i<=n;i++) {
if (f[i]>0&&i%(i-f[i])==0) cout<<i<<" "<<i/(i-f[i])<<endl;
}
}
return 0;
}
标签:cond 长度 std cstring string 选择 queue ret while
原文地址:https://www.cnblogs.com/hhlya/p/13233085.html