RT
这个题是POJ3167的修改版,基本一致
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
const int N = 100005;
int x[N], a[N], nex[N];
int pr1[N][30], pr2[N][30], n, m, s;
void init() {
memset(pr1, 0, sizeof(pr1));
memset(pr2, 0, sizeof(pr2));
pr1[1][x[1]] = pr2[1][a[1]] = 1;
for(int i = 2; i <= n; i++) {
memcpy(pr1[i], pr1[i-1], sizeof(pr1[0]));
pr1[i][x[i]]++;
}
for(int i = 2; i <= m; i++) {
memcpy(pr2[i], pr2[i-1], sizeof(pr2[0]));
pr2[i][a[i]]++;
}
}
void getnex() {
memset(nex, 0, sizeof(nex));
int i = 1, j = 0, k, si, sj, ei, ej;
nex[1] = 0;
while(i <= m) {
si = sj = ei = ej = 0;
for(k = 1; k < a[i]; k++)
si += pr2[i][k]-pr2[i-j][k];
ei = pr2[i][k]-pr2[i-j][k];
for(k = 1; k < a[j]; k++)
sj += pr2[j][k];
ej = pr2[j][k];
if(j == 0||(si == sj&&ei == ej))
i++, j++, nex[i] = j;
else j = nex[j];
}
}
void gao() {
int i, j, k, si, sj, ei, ej, pre = -1, num = 0;
for(i = j = 1; i <= n; ) {
si = sj = ei = ej = 0;
for(k = 1; k < x[i]; k++)
si += pr1[i][k]-pr1[i-j][k];
ei = pr1[i][k]-pr1[i-j][k];
for(k = 1; k < a[j]; k++)
sj += pr2[j][k];
ej = pr2[j][k];
if(j == 0||(si == sj&&ei == ej))
i++, j++;
else j = nex[j];
if(j == m+1) {
if (i - 1 - m >= pre) {
num ++;
pre = i - 1;
}
j = nex[j];
}
}
printf("%d\n", num);
}
int main() {
while(scanf("%d%d%d", &n, &m, &s) != EOF) {
for(int i = 1; i <= n; i++)
scanf("%d", &x[i]);
for(int i = 1; i <= m; i++)
scanf("%d", &a[i]);
init();
getnex();
gao();
}
return 0;
}