UVA5876 Writings on the Wall 扩展KMP

 扩展KMP的简单题。

#include<stdio.h>
#include<string.h>
#define maxn 51010
char s[maxn],t[maxn];
int extand[maxn],next[maxn];
void getnext(char *t)
{
    int i,k,j,len=strlen(t);
    next[0]=len;
    i=0;
    while(i<len-1&&t[i]==t[i+1])
    {
        i++;
    }
    next[1]=i;
    int a=1;
    for(k=2;k<len;k++)
    {
        int p=next[a]+a-1;
        int l=next[k-a];
        if(k-1+l>=p)
        {
            int j=p-k+1>0?p-k+1:0;
            while(k+j<len&&t[k+j]==t[j])
                j++;
            next[k]=j;
            a=k;
        }
        else next[k]=l;
    }
}
void ekmp(char *s,char *t)
{
    int i,j,slen=strlen(s),tlen=strlen(t),k;
    getnext(t);
    int minlen=slen<tlen?slen:tlen;
    int a=0;
    while(a<minlen&&s[a]==t[a])    a++;
    extand[0]=a;
    a=0;
    
    for(k=1;k<slen;k++)
    {
        int p=a+extand[a]-1;
        int l=next[k-a];
        if(k-1+l>=p)
        {
            int j=p-k+1>0?p-k+1:0;
            while(k+j<slen&&j<tlen&&s[k+j]==t[j])
                j++;
            extand[k]=j;
            a=k;
        }
        else extand[k]=l;
    }
}
int main()
{
    int i,j,tt;
    scanf("%d",&tt);
    while(tt--)
    {
        scanf("%s %s",s,t);
        ekmp(s,t);
        int len=strlen(s);
        int ans=0;
        for(i=0;i<len;i++)
        {
            //printf("%d %d
",extand[i],len-i);
            if(extand[i]>=len-i)
                ans++;
        }
        printf("%d
",ans+1);
    }
}
原文地址:https://www.cnblogs.com/sweat123/p/4738279.html