基礎算法 擴展KMP

繼續發模板……

#include<cstdio>
#include<cstring>
#define MAXN 1000000
using namespace std;
inline int max(int a,int b){return a>b?a:b;}
int next[MAXN+5],ex[MAXN+5];
char a[MAXN+5],b[MAXN+5];
void getdata(char *s1,char *s2,int *data)
{
    int i,j,k;
    int len1=strlen(s1),len2=strlen(s2);
    for(i=0,j=0;i<len1&&j<len2&&s1[i]==s2[j];i++,j++);
    data[0]=j;
    for(i=1,j=0;i<len1&&j<len2&&s1[i]==s2[j];i++,j++);
    data[1]=j;
    int maxi=1,maxp=0;
    for(i=2;i<len1;i++)
    {
        if(i+next[i-maxi]<maxp)
            data[i]=next[i-maxi];
        else
        {
            for(k=max(maxp,i);k<len1&&k-i<len2&&s1[k]==s2[k-i];k++);
            maxp=k;
            maxi=i;
            data[i]=(k-i)>0?k-i:0;
        }
    }
}
int main()
{
    scanf("%s%s",a,b);
    int len=strlen(a);
    getdata(b,b,next);
    getdata(a,b,ex);
    printf("%d",ex[0]);
    for(int i=1;i<len;i++)
        printf(" %d",ex[i]);
}


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