自动机转换

#include<stdio.h>
#define N 30
char str[N]={NULL};
void Print(int i,char y);
int st[N];
int t=0,k=0;
struct node//定义一个队列
{
    char data;
    struct node * next;
};
typedef struct node QueueNode;
struct node2//定义一个链队列
{
    QueueNode *front;
    QueueNode *rear;
};
typedef struct node2 Queue;
Queue InitQueue()//初始化队列
{
    Queue Q;
    Q.front=(QueueNode *)malloc(sizeof(QueueNode));
    Q.front->next=NULL;
    Q.rear=Q.front;
    return(Q);
}
Queue InserQ(Queue Q,char x)//x进队列
{
    QueueNode *p;
    p=(QueueNode *)malloc(sizeof(QueueNode));
    p->data=x;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return(Q);
}
Queue DeleteQ(Queue Q)//出队列
{
    int i=t++,j;
    QueueNode *p;
    char y=NULL;
    if(Q.front==Q.rear)
    {
        printf("队列为,无法出队列!");//判断队列是否为空
        return(Q);
    }
    p=Q.front->next;
    y=Q.front->next->data;//将队列中的元素赋值给y
    Q.front->next=p->next;
    if(p==Q.rear)
        Q.rear=Q.front;
    str[t]=y;
    st[k]=t;
    if(y!=‘|‘)
    {
        if(p->next->data==‘*‘&&p->next!=NULL)
        {
            str[t]=‘~‘;
            Print(0,‘~‘);
            str[t+1]=y;
            Print(t,y);
            str[t+2]=‘~‘;
            k--;
            Print(t,‘~‘);
            free(p->next);
        }
        else
            Print(i,y);
    }
    if(y==‘|‘)
    {
        k--;
        t--;
    }
    k++;
    free(p);
    return Q;
}
void Print(int i,char y);//调用函数来判断并输出
main()
{
    char x,y;
    Queue p,q;
    p=InitQueue();
    printf("请输入正规式:");
    while(scanf("%c",&x)==1&&x!=‘\n‘)//大神的方法,牛
        p=InserQ(p,x);
    q=p;
    while(p.front!=p.rear)
        p=DeleteQ(p);
}
void Print(int i,char y)//调用函数来判断并输出
{
    printf("f(%d,%c)=%d\n",i,y,st[k]);

    memset(str,0,N);//清空数组str里的所有元素
}
时间: 2024-10-29 19:11:22

自动机转换的相关文章

AC自动机

AC自动机 直接学AC自动机比较难理解,强烈建议先学完KMP和字典树并进行一定的练习后,对于失配指针和字典树构造有一定理解后再来学AC自动机的内容.有关AC自动机的详细介绍可见刘汝佳的<算法竞赛入门经典训练指南>P214. 给你一个字典(包含n个不重复的单词),然后给你一串连续的字符串文本(长为len),问你该文本里面的哪些位置正好出现了字典中的某一个或某几个单词?输出这些位置以及出现的单词. 这个问题可以用n个单词的n次KMP算法来做(效率为O(n*len*单词平均长度)),也可以用1个字典

利用子集构造法实现NFA到DFA的转换

概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够比较方便的机械实现且识别能力方面也和NFA相当.本次实验采用子集构造法来实现不带空弧的由NFA到DFA的转换. 子集构造法的算法如下: 设NFA为M=(K,Σ,f,S0,Z),则构造相应的DFA  M′=(Q,Σ,f′,I0,F)①取I0=S0:②对于状态集Q中任一尚未标记的状态qi={Si1,Si

后缀自动机总结

后缀自动机是一种确定性有限自动机(DFA),它可以且仅可以匹配一个给定串的任意后缀. 构造一个可以接受一个给定串的所有后缀的不确定性有限自动机(NFA)是很容易的,我们发现我们用通用的将NFA转换成对应DFA的算法转换出来的DFA的状态数都很小(O(n)级别的,远远达不到指数级别).于是,人们就开始研究这种特殊的NFA,并提出了在线增量算法,用O(n)的时间复杂度构造该NFA的DFA.在转换过程中,DFA中对应的NFA中的状态集合其实就是我们的right集合.——————以上在胡扯———————

uva 11468 - Substring(AC自动机+概率)

题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符对应的选择概率,随机选择L次后得到一个长度为L的字符串,要求该字符串不包含任意一个子串的概率. 解题思路:构造AC自动机之后,每随机生成一个字母,等于是在AC自动机上走一步,所有子串的结束位置的节点标记为禁止通行,然后问题转换成记忆搜索处理. #include <cstdio> #include <cstring> #include <queue> #include <algor

BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Status][Discuss] Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的:l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最

【BZOJ-1030】文本生成器 AC自动机 + DP

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3253  Solved: 1330[Submit][Status][Discuss] Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完

[C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ

前言 做过杭电.浙大或是北大等ACM题库的人一定对“刷题”不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到“Online Exercise”下的“Problem Archive”,然后从众多题目中选择一个进行读题.构思.编程.然后提交.最后查看题解状态,如果AC了表示这一题被攻克了,否则就要重做了~一般情况下,“刷题”要求精神高度集中且经验丰富,否则很难成功AC,有时候甚至做一题要浪费半天的时间!(有时网速卡了,比抢火车票还要急!) 楼主在

hdu 2825 aC自动机+状压dp

Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5640    Accepted Submission(s): 1785 Problem Description Liyuan lives in a old apartment. One day, he suddenly found that there

编译原理DFA(有限确定自动机)的构造

原题: 1.自己定义一个简单语言或者一个右线性正规文法 示例如(仅供参考)  G[S]:S→aU|bV    U→bV|aQ V→aU|bQ     Q→aQ|bQ|e 2.构造其有穷确定自动机,如 3.利用有穷确定自动机M=(K,Σ,f, S,Z)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”       K:=S: c:=getchar; while c<>eof do {K:=f(K,c); c:=get