HDU-1711 Number Sequence
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
int nxt[maxn], n, m;
void getNext(int p[]) {
int i=0, k=-1;
nxt[i] = -1;
while(i<m) {
if(k==-1 || p[i]==p[k]) {
if(p[++i] != p[++k]) nxt[i] = k;
else nxt[i] = nxt[k];
} else
k = nxt[k];
}
}
int kmp_match(int t[],int p[]) {
int i=0, j=0, cnt=0;
while(i<=n-1) {
if(j<0 || t[i]==p[j]) {
i++; j++;
} else
j=nxt[j];
if(j==m) {
cnt++;
j=nxt[j];
}
}
return cnt;
}
int kmp_search(int t[],int p[]) {
int i=0, j=0;
while(i<n && j<m) {
if(j<0 || t[i]==p[j]) {
i++; j++;
} else
j=nxt[j];
}
if(j==m) return i-j+1;
else return -1;
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int a[maxn], b[maxn];
scanf("%d%d", &n, &m);
for(int i=0; i<n; i++) scanf("%d", a+i);
for(int i=0; i<m; i++) scanf("%d", b+i);
getNext(b);
int ans = kmp_search(a, b);
printf("%d\n", ans);
}
}
HDU-3746 Cyclic Nacklace
PS:计算循环节
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
int nxt[maxn];
char a[maxn];
void getNext(char p[]) {
int i=0, k=-1, len=strlen(p);
nxt[i] = -1;
while(i<len) {
if(k==-1 || p[i]==p[k]) {
nxt[++i] = ++k;
} else
k = nxt[k];
}
}
int kmp_match(char t[],char p[]) {
int i=0, j=0, cnt=0;
int n=strlen(t), m=strlen(p);
while(i<=n-1) {
if(j<0 || t[i]==p[j]) {
i++; j++;
} else
j=nxt[j];
if(j==m) {
cnt++;
j=nxt[j];
}
}
return cnt;
}
int kmp_search(char t[],char p[]) {
int i=0, j=0;
int n=strlen(t), m=strlen(p);
while(i<n && j<m) {
if(j<0 || t[i]==p[j]) {
i++; j++;
} else
j=nxt[j];
}
if(j==m) return i-j+1;
else return -1;
}
int main() {
int n, m, t;
scanf("%d", &t);
while(t--) {
scanf("%s", a);
getNext(a);
int len = strlen(a);
int l = len - nxt[len];
if(nxt[len] && len%l==0) printf("0\n");
else printf("%d\n", l - nxt[len]%l);
}
}