• HDU 2222


    这题应该是用输入的模式串应该是可以有多个相同的,所以有count++,而且有一个地方是

    if(temp->count>0)   //>0是必须的。
    {
    cnt+=temp->count;
    temp->count=0;
    }
    temp=temp->fail;

    #include<stdio.h>
    #include<string.h>
    #include<malloc.h>
    #include<queue>
    using namespace std;
    char str[1000000+100];
    
    struct node
    {
        int count;
        struct node *next[26];
        struct node *fail;
        void init()
        {
            int i;
            for(i=0;i<26;i++)
                next[i]=NULL;
            count=0;
            fail=NULL;
        }
    }*root;
    void insert()
    {
        int len,k;
        node *p=root;
        len=strlen(str);
        for(k=0;k<len;k++)
        {
            int pos=str[k]-'a';
            if(p->next[pos]==NULL)
            {
                p->next[pos]=new node;
                p->next[pos]->init();
                p=p->next[pos];
            }
            else 
                p=p->next[pos];
        }
        p->count++;
    }
    void getfail()
    {
        int i;
           node *p=root,*son,*temp;
           queue<struct node *>que;
           que.push(p); 
           while(!que.empty())
           {
               temp=que.front();
               que.pop();
               for(i=0;i<26;i++)
               {
                   son=temp->next[i];
                   if(son!=NULL)
                   {
                       if(temp==root) {son->fail=root;}
                       else
                       {
                           p=temp->fail;
                           while(p)
                           {
                               if(p->next[i])
                               {
                                   son->fail=p->next[i];
                                   break;
                               }
                               p=p->fail;
                           }
                           if(!p)  son->fail=root;
                       }
                       que.push(son);
                   }
               }
           }
    }
    void query()
    {
        int len,i,cnt=0;
        len=strlen(str);
        node *p,*temp;
        p=root;
        for(i=0;i<len;i++)
        {
            int pos=str[i]-'a';
            while(!p->next[pos]&&p!=root)  p=p->fail;      
            p=p->next[pos];
            if(!p) p=root;
            temp=p;
            while(temp!=root)
            {
                if(temp->count>0) 
                {
                    cnt+=temp->count;
                    temp->count=0;  
                }
                temp=temp->fail; 
            }
        }
        printf("%d
    ",cnt);
    }
    int main()
    {
        int cas,n;
        scanf("%d",&cas);
        while(cas--)
        {
            root=new node;
            root->init();
            root->fail=NULL;
            scanf("%d",&n);
            int i;
            getchar();
            for(i=0;i<n;i++)
            {
                gets(str);
                insert();
            }
            getfail();
            gets(str);
            query();
        }
        return 0;
    }
    

      

  • 相关阅读:
    ActiveMQ消息队列技术融合Spring
    ActiveMQ消息队列技术Demo
    网页静态化技术Freemaker
    Solr的基本语法
    Solr的页面展示以及高亮显示
    Solr的了解与配置
    Angular中上传图片到分布式文件服务器FastDFS上
    分布式文件服务器FastDFS的使用
    自我学习笔记01
    数组转换成List集合
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4306231.html
Copyright © 2020-2023  润新知