您的位置:首页 > 其它

p587有限自动机

2016-04-14 21:44 253 查看
这是书上的普通版本:

#include<stdio.h>
#include<string.h>
#define maxn 1000
#define maxm 100
int 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 100
int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: