给你两个柱状图,需要在第一个图里找到第二个图形状的个数
由于第二个图可以上下移动,所以只要区间内的差值相等即可。
所以求出相邻两个柱体的差值然后就是字符串匹配的问题了。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN=3000010;
int a[MAXN];
int b[MAXN];
int n,w;
int nextval[MAXN];
void get_nextval(){
int j=1,k=0;
nextval[1]=0;
while(j<=w){
if(k==0||b[j]==b[k]){
k++;
j++;
nextval[j]=k;
}
else
k=nextval[k];
}
}
int x[MAXN],y[MAXN];
int main()
{
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++){
scanf("%d",x+i);
}
for(int i=1;i<=w;i++){
scanf("%d",y+i);
}
if(w==1){
printf("%d\n",n);
return 0;
}
n--,w--;
for(int i=1;i<=n;i++){
a[i]=x[i+1]-x[i];
}
for(int i=1;i<=w;i++){
b[i]=y[i+1]-y[i];
}
get_nextval();
//for(int i=1;i<=w;i++)
// printf("%d ",nextval[i]);
printf("\n");
int i=1,j=1;
int cnt=0;
while(i<=n){
if(a[i]==b[j]||j==0){
i++;
j++;
}
else
j=nextval[j];
if(j==w+1){
j=nextval[j];
cnt++;
}
}
printf("%d\n",cnt);
}