zoukankan      html  css  js  c++  java
  • AC日记——Keywords Search hdu 2222

    2222

    思路:

      ac自动机模板题;

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    #define maxn 500005
    
    struct TreeNodeType {
        int count;
        
        TreeNodeType *fail;
        
        TreeNodeType *next[26];
        
        TreeNodeType()
        {
            fail=NULL,count=0;
            for(int i=0;i<26;i++) next[i]=NULL;
        }
    };
    struct TreeNodeType *root,*que[maxn];
    
    int n;
    
    char str[maxn*2],word[100];
    
    inline void in(int &now)
    {
        char Cget=getchar();now=0;
        while(Cget>'9'||Cget<'0') Cget=getchar();
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
    }
    
    void insert(char *ch)
    {
        int temp,len=strlen(ch);
        TreeNodeType *p=root;
        for(int i=0;i<len;i++)
        {
            temp=ch[i]-'a';
            if(p->next[temp]==NULL) p->next[temp]=new TreeNodeType;
            p=p->next[temp];
        }
        p->count++;
    }
    
    void build()
    {
        int tail=1,head=0;que[head]=root;
        while(head<tail)
        {
            TreeNodeType *p=que[head++],*temp=NULL;
            for(int i=0;i<26;i++)
            {
                if(p->next[i]==NULL) continue;
                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;
                }
                que[tail++]=p->next[i];
            }
        }
    }
    
    int query()
    {
        int pos,len=strlen(str),res=0;TreeNodeType *p=root;
        for(int i=0;i<len;i++)
        {
            pos=str[i]-'a';
            while(p->next[pos]==NULL&&p!=root) p=p->fail;
            if(p->next[pos]!=NULL) p=p->next[pos];else p=root;
            TreeNodeType *temp=p;
            while(temp!=root&&temp->count!=-1) res+=temp->count,temp->count=-1,temp=temp->fail;
        }
        return res;
    }
    
    int main()
    {
        int T;
        in(T);
        while(T--)
        {
            root=new TreeNodeType;
            in(n);for(int i=1;i<=n;i++) gets(word),insert(word);
            build(),scanf("%s",str),printf("%d
    ",query());
        }
        return 0;
    }
  • 相关阅读:
    json&pickle模块
    Linux BASH 常用命令
    Vmware安装Kali2020
    CentOS7部署Prometheus
    CentOS7部署FreeRadius3.0及WEB管理界面DaloRadius
    Cisco VRRP、TRACK、SLA配置
    Cisco L2TP OVER IPSEC
    Cisco PPTP Server Configration
    华为S5700交换机初始化和配置TELNET远程登录
    华为S5720常用命令
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6854899.html
Copyright © 2011-2022 走看看