zoukankan      html  css  js  c++  java
  • hdu3065 AC自动机

    比较简单。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define kind 96
    #define maxn 2000000
    struct node
    {
        node *fail;
        node *next[kind];
        int flag;
        int id;
        void init(){
            fail=NULL;
            memset(next,NULL,sizeof(next));
            flag=0;
            id=0;
        }
    }*q[500000];
    node *root;
    int head,tail;
    char str[1002][52],s[maxn];
    int vis[1005];
    void insert(char *s,int c)
    {
        node *p=root,*qq;
        int i,j,len=strlen(s);
        for(i=0;i<len;i++)
        {
            int id=s[i]-32;
            if(p->next[id]==NULL)
            {
                qq=new node;
                qq->init();
                p->next[id]=qq;
            }
            p=p->next[id];
        }
        p->flag++;
        p->id=c;
    }
    void build_ac()
    {
        int i;
        node *temp,*p;
        head=tail=0;
        q[tail++]=root;
        while(head!=tail)
        {
            p=q[head++];
            for(i=0;i<kind;i++)
            {
                if(p->next[i]!=NULL)
                {
                    if(p==root)
                        p->next[i]->fail=root;
                    else
                    {
                        temp=p->fail;
                        while(temp!=NULL)
                        {
                            if(temp->next[i]!=NULL)
                            {
                                p->next[i]->fail=temp->next[i];
                                break;
                            }
                            temp=temp->fail;
                        }
                        if(temp==NULL)
                            p->next[i]->fail=root;
                    }
                    q[tail++]=p->next[i];
                }
            }
        }
    }
    void query(char *s)
    {
        node *p=root,*temp;
        int i,j,len=strlen(s);
        for(i=0;i<len;i++)
        {
            int id=s[i]-32;
            while(p->next[id]==NULL&&p!=root)
            {
                p=p->fail;
            }
            p=p->next[id];
            if(p==NULL)
                p=root;
            temp=p;
            while(temp!=root&&temp->flag>0)
            {
                vis[temp->id]++;
                temp=temp->fail;
            }
        }
    }
    void freenode(node *root)
    {
        for(int i=0;i<kind;i++)
        {
            if(root->next[i]!=NULL)
                freenode(root->next[i]);
        }
        free(root);
    }
    int main()
    {
        int i,j,n;
        while(scanf("%d",&n)!=EOF)
        {
            root=new node;
            root->init();
            memset(vis,0,sizeof(vis));
            for(i=1;i<=n;i++)
            {
                scanf("%s",str[i]);
                insert(str[i],i);
            }
            build_ac();
            scanf("%s",s);
            query(s);
            for(i=1;i<=n;i++)
            {
                if(vis[i]>0)
                    printf("%s: %d
    ",str[i],vis[i]);
            }
            freenode(root);
        }
    }
  • 相关阅读:
    一些概念理解(持续更新)
    python练习题
    linux常用命令
    数据库索引的一点学习(待更新)
    sql注入的一点学习(待更新)
    python 选择排序的实现
    python 冒泡排序的实现
    1--初始配置
    0--HttpUrlConnection 基础知识
    1--HTTP基础知识
  • 原文地址:https://www.cnblogs.com/sweat123/p/4741383.html
Copyright © 2011-2022 走看看