简易自动机

#include<stdio.h>
#define MAX 20
main()
{
    int i=0,j=0,k,l,m,n,number;
    char ch;
    char a[MAX][MAX];
    printf("请输入正规式:");
    ch=getchar();
    while(ch!=‘\n‘)
    {
        if(ch==‘/‘)
        {
            a[i][j]=‘\0‘;
            j=0;
            i++;
            ch=getchar();
            continue;
        }
        a[i][j]=ch;
        j++;
        ch=getchar();
    }
    a[i][j]=‘\0‘;
    number=2;
    for(k=0;k<=i;k++)
    {
        l=0;
        m=1;
        while(a[k][l]!=‘\0‘)
        {
            if(a[k][l]==‘.‘||a[k][l]==‘*‘)
            {

               if(a[k][l]==‘.‘&&m==1)
               {
                 m++;
                 printf("f(0,%c)=%d\n",a[k][l-1],number);
                 if(a[k][l+2]==‘\0‘)
                  printf("f(%d,%c)=1\n",number,a[k][l+1]);
                 number=number+1;
               }

               else if(a[k][l]==‘.‘&&m!=1)
               {
                   m++;
                   printf("f(%d,%c)=%d\n",number-1,a[k][l-1],number);
                   if(a[k][l+2]==‘\0‘)
                    printf("f(%d,%c)=1\n",number,a[k][l+1]);
                    number=number+1;
               }

               else if(a[k][l]==‘*‘&&m==1)
               {
                   m++;
                   printf("f(0,~)=%d\n",number);
                   printf("f(%d,%c)=%d\n",number,a[k][l-1],number);
                   if(a[k][l+1]==‘\0‘)
                    printf("f(%d,~)=1\n",number);
                   else
                    printf("f(%d,~)=%d\n",number,number+1);
                   number=number+1;
               }

               else if(a[k][l]==‘*‘&&m!=1)
               {
                    m++;

                   printf("f(%d,%c)=%d\n",number,a[k][l-1],number);
                   if(a[k][l+1]==‘\0‘)
                    printf("f(%d,~)=1\n",number);
                   else
                    printf("f(%d,~)=%d\n",number,number+1);
                   number=number+1;
               }
            }
            l++;
        }
    }

}

转自队长
时间: 2024-11-05 16:00:53

简易自动机的相关文章

多模字符串匹配算法之AC自动机—原理与实现

简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上是KMP算法的树形扩展.这篇文章主要介绍AC自动机的工作原理,并在此基础上用Java代码实现一个简易的AC自动机. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 应用场景-多模字符串匹配 我们现在考虑这样一个问题,在一个文本串t

关于自动机的相关问题

根据自动机的原理,我参考了一些资料,做了一个简易的c程序实现. #include<stdio.h> #include<string.h> #define MAX 20 int n=1; void tackBack(char sh[],int start,int End,int Begain,int Fin);//进行判定操作 int main(){ char sh[MAX]; int size; scanf("%s",sh); size=strlen(sh);

暑假集训day9补充(AC自动机)

推荐网站http://blog.csdn.net/niushuai666/article/details/7002823 AC自动机嘛,此AC(aho-corasick)非彼AC(Accepted). 我也不是很会解释 有一题是必须打的hdu2222. #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int mn=

ac自动机基础模板(hdu2222)

In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey also wants to bring this feature to his image retrieval system. Every image have a long description, when users type some keywords to find the image, th

HDU 2825 Wireless Password AC自动机+dp

训练赛第二场的I题,上完体育课回来就把这题过了,今天训练赛rank1了,还把大大队虐了,而且我还过了这道题 (虽然我也就过了这道题...),第一次在比赛中手写AC自动机还带dp的,心情大好. 给一个字符串集合,求包含该集合超过K个字符的,长度为L的字符串的个数. 显然是在AC自动机上跑dp,设dp[u][L][k]表示当前在结点u,还要走L步,当前状态为k的个数.一开始第三维表示的是包含k个字符串,但是题目要求不含重复的,那就只能状压了.转移为dp[u][L][k]+=dp[v][L-1][nk

Android 开发第七弹:简易时钟(秒表)

本文承接,Android 开发第五弹:简易时钟(闹钟) 和 Android 开发第六弹:简易时钟(计时器),这一部分是关于秒表的. 布局 同样是新建一个类(StopWatchView)并扩展自LinearLayout,并将其用作布局. <myapplication.nomasp.com.clock.StopWatchView android : id = "@+id/tabStopWatch" android : layout_width = "match_parent

HDU 2896-病毒侵袭(ac自动机)

题意: 给定多个模式串,每给一个母串,输出包含模式串的编号,最后输出包含模式串的母串的数量. 分析: ac自动机模板 #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <st

hdu2222 Keywords Search &amp; AC自动机学习小结

传送门:http://http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路:AC自动机入门题,直接上AC自动机即可. 对于构建AC自动机,我们要做的只有三件事: 1)构建字典树 2)构建失败指针 3)构建trie图(这道题好像不做这一步也能A...但是这一步不做是会被卡成O(n^2)的...) 1)第一步还是比较好理解的 根是虚根,边代表字母,那么根到终止节点的路径就是一个字符串,这样对于前缀相同的字符串我们就可以省下存公共前缀的空间. 加入一个模式

hdoj 2896 病毒侵袭(AC自动机)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 思路分析:题目为模式匹配问题,对于一个给定的字符串,判断能匹配多少个模式:该问题需要静态建树,另外需要对AC自动机的模板加以修改, 对于每个匹配的模式的最后一个单词的fail指针指向root,即可实现一个字符串进行多次模式匹配: 代码如下: #include <queue> #include <cstdio> #include <cstring> #include &