之前說了KMP中next的應用,今天做了這道題,又栽了。
這道題跟我之前寫的有一個小區別
比如子串aa,模式串aaaa。
之前寫的答案是2,現在的答案是3。
就是模式串中的字母可以重複使用,但不可以一模一樣。
開始的時候我改了i的座標位置。這樣就是可以使他接着匹配成功
#include<stdio.h>
#include<string.h>
const int maxn=1e6+10;
char s1[maxn],s2[maxn];
int next[maxn];
int len1,len2,f;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s%s",s1,s2);
len1=strlen(s1);
len2=strlen(s2);
int i=0,j=-1;
memset(next,0,sizeof(next));
next[0]=-1;
while(i<len1)
{
if(j==-1||s1[i]==s1[j])
next[++i]=++j;
else
j=next[j];
}
for(int i=1;i<=len1;i++)
printf("%d ",next[i]);
puts("");
i=0,j=0,f=0;
int ans=0;
while(i<len2)
{
if(f==1) break;
if(s1[j]==s2[i])
{
if(j==len1-1)
{
ans++;
<span style="color:#ff0000;">j=next[j];//就是這一步。以前都是j=-1</span>
//printf("%d %d\n",i,j);
}
else
{
i++,j++;
}
}
else
{
if(j==-1)
{
i++;
j++;
}
else
j=next[j];
}
}
printf("%d\n",ans);
}
return 0;
}
的第二個字母繼續匹配。
但是超時了。
然後把j=-1改成了 j=next[j]就過了。
其實他繼續匹配的時候沒有把j變0,而是繼續往下匹配。就達到了重複使用了字母的效果。