p587有限自动机

来源:互联网 发布:ios 可变字典添加数据 编辑:程序博客网 时间:2024/05/19 20:42

这是书上的普通版本:

#include<stdio.h>#include<string.h>#define maxn 1000#define maxm 100int f[maxm+1][26];int is_suffix(char p[],int k,int q,char a){    int i;    if (k==0)        return 1;    if (p[k-1]!=a)        return 0;    for (i=0;i<k-1;i++)        if (p[i]!=p[q-k+1+i])            return 0;    return 1;}int comf(char p[],int m){    int q,k;    for (q=0;q<=m;q++)    {        char a;        for (a='a';a<='z';a++)        {            k=q+1<=m?q+1:m;            while (!is_suffix(p,k,q,a))                k--;            f[q][(int)(a-'a')]=k;        }    }    return 0;}int match(char t[],char p[],int n,int m){    int q=0,i;    for (i=0;i<n;i++)    {        q=f[q][(int)(t[i]-'a')];        if (q==m)            printf("%d\n",i-m+1);    }    return 0;}int main(void){    char t[maxn],p[maxm];    int n,m;    scanf("%s",t);    scanf("%s",p);    n=strlen(t);    m=strlen(p);    comf(p,m);    match(t,p,n,m);    return 0;}

这是32.4-8用π函数加速求delta函数的版本

#include<stdio.h>#include<string.h>#define maxn 1000#define maxm 100int dt[maxm+1][26],f[maxm+1];int computf(char p[]){    int i,m=strlen(p);    f[1]=0;    int k=0;    for (i=2;i<=m;i++)    {        while (k>0&&p[k]!=p[i-1])            k=f[k];        if (p[k]==p[i-1])            k++;        f[i]=k;    }    return 0;}int computdt(char p[]){    int q,m=strlen(p);    char a;    for  (q=0;q<=m;q++)        for (a='a';a<'z';a++)        {            int k=q;            while (k>0&&p[k]!=a)                k=f[k];            if (p[k]==a)                k++;            dt[q][(int)(a-'a')]=k;        }    return 0;}int match(char t[],char p[]){    int n=strlen(t),m=strlen(p),i,q=0;    for (i=0;i<n;i++)    {        q=dt[q][(int)(t[i]-'a')];        if (q==m)            printf("%d ",i-m+1);    }    return 0;}int main(void){    char t[maxn],p[maxm];    scanf("%s",t);    scanf("%s",p);    computf(p);    computdt(p);    match(t,p);    return 0;}
0 0
原创粉丝点击