hiho一下1015

之前說了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,而是繼續往下匹配。就達到了重複使用了字母的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章