优质博客推荐
hdu1711
#include<stdio.h>
#include<string.h>
#define mem(a,b) memset(a,b,sizeof(a))
int a[1000005];
int b[10005];
int nex[10005];
int n,m;
void KMP()
{
mem(nex,0);
nex[0]=-1;
int i=0,k=-1;
while(i<m)
{
if(k==-1||b[i]==b[k])
{
i++;
k++;
if(b[i]!=b[k])
nex[i]=k;
else
nex[i]=nex[k];
}
else
{
k=nex[k];
}
}
}
int get()
{
int i=0,j=0;
int flag=0;
while(i<n&&j<m)
{
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else
{
j=nex[j];
}
if(j==m)
{
flag=1;
break;
}
}
if(flag)
return i;
else
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
mem(a,0);
mem(b,0);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
for(int i=0; i<m; i++)
scanf("%d",&b[i]);
KMP();
if(get()==-1)
printf("-1\n");
else
printf("%d\n",get()-m+1);
}
return 0;
}
nyoj5
#include<stdio.h>
#include<string.h>
#define mem(a,b) memset(a,b,sizeof(a))
char a[10005];
char b[10005];
int nex[10005];
int n,m;
void KMP()
{
mem(nex,0);
nex[0]=-1;
int i=0,k=-1;
while(i<m)
{
if(k==-1||b[i]==b[k])
{
i++;
k++;
if(b[i]!=b[k])
nex[i]=k;
else
nex[i]=nex[k];
}
else
{
k=nex[k];
}
}
}
int get()
{
int i=0,j=0;
int flag=0;
while(i<n)
{
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else
{
j=nex[j];
}
if(j==m)
{
i=i-j;
j=-1;
flag++;
}
}
return flag;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
mem(a,0);
mem(b,0);
scanf("%s",b);
scanf("%s",a);
n=strlen(a);
m=strlen(b);
KMP();
printf("%d\n",get());
}
return 0;
}