题目链接:http://acm.uestc.edu.cn/#/problem/show/1091
题意:中文题目
解法:KMP
Trick: 用memset会挂
//UESTC 1091
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000010;
int a[maxn], b[maxn], c[maxn], d[maxn], fail[maxn];
int main()
{
int n, m;
//while(~scanf("%d", &n))
//{
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
scanf("%d", &m);
for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
n--, m--;
for(int i = 1; i <= n; i++) c[i] = a[i+1]-a[i];
for(int i = 1; i <= m; i++) d[i] = b[i+1]-b[i];
//memset(fail, 0, sizeof(fail));
int j = 0;
for(int i = 2; i <= m; i++){
while(j > 0 && d[i] != d[j+1]) j = fail[j];
if(d[i] == d[j+1]) j++;
fail[i] = j;
}
j = 0;
int ans = 0;
for(int i = 1; i <= n; i++){
while(j > 0 && d[j+1] != c[i]) j = fail[j];
if(d[j+1] == c[i]) j++;
if(j == m){
ans++;
j = fail[j];
}
}
if(ans){
printf("Wow! Life Winner!\n%d\n", ans);
}
else{
printf("Oh. That's impossible. I must have had a dream.\n");
}
//}
return 0;
}