zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    react 安装脚手架过程
    微信小程序-分享功能
    echarts 实现多图联动显示tooltip
    dom 相同父节点查找
    js 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果
    vue手写el-form组件
    vue组件传值、通信
    vue项目打包桌面应用 exe程序 以及打包为安装程序exe
    vue 使用echarts来制作图表
    前端数据可视化插件-图表
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4306231.html
Copyright © 2011-2022 走看看