p587有限自动机
2016-04-14 21:44
253 查看
这是书上的普通版本:
这是32.4-8用π函数加速求delta函数的版本
#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; }
相关文章推荐
- java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码
- [php-src]一个Php扩展的结构
- 软件工程概论课堂作业3
- 小谈业务应用架构
- here we go
- 笔记练习:《Javascript入门经典(第5版)》page233_19.8Practice
- 数据库事务的四个特性
- MyString类的实现
- java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**
- 堆排序
- 复利计算结对2.0
- 好累
- TopologyBuilder
- AVL树插入和删除
- C语言-郝斌笔记-003数据类型
- 函数的调用优化
- java输入学生成绩
- java怎么连接mysql数据库
- Linux---centos搭建SVN服务器
- php 的快速学习和掌握。