hiho一下1015

来源:互联网 发布:知乎泰语翻译价格 编辑:程序博客网 时间:2024/06/05 20:10

之前说了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,而是继续往下匹配。就达到了重复使用了字母的效果。

0 0
原创粉丝点击