标签:
主要是理解算法吧,,,,,next的运用。。。。。
至于代码还是用模板吧,,自己写比较难理解?感觉。。。。。。
HDU 1686 纯模板
#include<stdio.h>
#include<string.h>
char F[10010010];
char S[10010];
int next[10010];
int lenF;
int lenS;
void get_next()
{
int i=1;
int j=0;
next[1]=0;
while(i<=lenS)
{
if(j==0||S[i]==S[j])
{
i++;
j++;
if(S[i]!=S[j])
next[i]=j;
else next[i]=next[j];
}
else
{
j=next[j];
}
//printf("%d\n",j);
}
}
void kmp()
{
int i=1;
int j=1;
int count=0;
while(i<=lenF&&j<=lenS)
{
if(j==0||F[i]==S[j])
{
i++;
j++;
}
else
{
j=next[j];
}
if(j>lenS)
{
count++;
j=next[j];
}
}
printf("%d\n",count);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",S+1);
scanf("%s",F+1);
lenS=strlen(S+1);
lenF=strlen(F+1);
get_next();
kmp();
}
HDU2203
#include<stdio.h>
#include<string.h>
char a[200001],b[100001];
int next[100001];
int len1,len2;
void get_next()
{
int i=1;
int j=0;
next[1]=0;
while(i<=len2)
{
if(j==0||b[i]==b[j])
{
i++; j++;
if(b[i]!=b[j]) next[i]=j;
else next[i]=next[j];
}
else
{
j=next[j];
}
}
}
void kmp()
{
int i=1,j=1;
int count=0;
while(i<=len1&&j<=len2)
{
if(j==0||a[i]==b[j])
{
i++; j++;
}
else j=next[j];
if(j>len2)
{
count++;
j=next[j];
}
}
if(count>0) printf("yes\n");
else printf("no\n");
}
int main()
{
while(scanf("%s",a+1)!=EOF)
{
len1=strlen(a+1);
for(int i=1;i<=len1;i++)
{
a[len1+i]=a[i];
}
len1=strlen(a+1);
//printf("%s****\n",a+1);
scanf("%s",b+1);
len2=strlen(b+1);
get_next();
kmp();
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zhangwenchi/article/details/47153899