【HDU】2222 Keywords Search(AC自动机)

news/2024/7/7 7:20:54

题目

传送门:QWQ

 


分析

 

$ AC $自动机模板,黈力的码风真的棒极了,这是我抄他的。

还有 题号不错


 

代码

 

#include <cstdio>
#include <cstring>
#define N 500007
using namespace std;
int n,rt,newp,i,m,l,r,son[N][26],fail[N],cur,j,end[N],q[N],vis[N],ans[N],end2[N],end3[N];
char s[1000000];
int find(int cur,int i){
    if(!cur)return rt;
    if(son[cur][i])return son[cur][i];
    return fail[son[cur][i]]=find(fail[cur],i);
}
int main(){
    int T; scanf("%d",&T);
    while(T--)
    {
        memset(son,0,sizeof(son));memset(fail,0,sizeof(fail));memset(vis,0,sizeof(vis));
        memset(q,0,sizeof(q));memset(end,0,sizeof(end));memset(ans,0,sizeof(ans));
        memset(end2,0,sizeof(end2)); memset(end3,0,sizeof(end3));
    scanf("%d",&n);
    rt=newp=1;
    for(i=1;i<=n;i++){
        scanf("%s",s+1);
        m=strlen(s+1);
        for(cur=rt,j=1;j<=m;j++){
            if(!son[cur][s[j]-'a'])
                son[cur][s[j]-'a']=++newp;
            cur=son[cur][s[j]-'a'];
        }
        end[cur]=i;
        end2[cur]++;
        end3[i]=cur;
    }
    for(q[l=r=1]=rt;l<=r;l++){
        for(i=0;i<26;i++)
        if(son[q[l]][i]){
            fail[son[q[l]][i]]=find(fail[q[l]],i);
            q[++r]=son[q[l]][i];
        }
    }
    scanf("%s",s+1);
    m=strlen(s+1);int ansx=0;
    for(i=1,cur=rt;i<=m;i++)
        cur=find(cur,s[i]-'a'),vis[cur]++;
    for(i=r;i>=1;i--){
        vis[fail[q[i]]]+=vis[q[i]];
        if(end[q[i]])
        {
            if(vis[q[i]]!=0) ansx+=end2[q[i]];
        }
    }
    printf("%d\n",ansx);
    }
    return 0;
}
/*
1
10
ab aba bba a aa a a aba b b
ababbaba
*/

 

转载于:https://www.cnblogs.com/noblex/p/8419954.html


http://www.niftyadmin.cn/n/4558328.html

相关文章

二叉树遍历问题

4位于左子树 选A 答案补充 首先 然后 1是根结点 从先根和后根可知道 3 5 7 6 在右子树 7 5 6 3是后根遍历 ||| C4217536 3 5 7 6是先根遍历 右子树中 2是4的父节点

如何清爽的使用网页版新浪微博

网页版&#xff08;当然&#xff0c;应用端也一样&#xff09;新浪微博在我们正常关注的用户的微博之间插入了巨量的推广微博&#xff0c;有时候连刷一两页可能都看不到自己关注的人的微博&#xff0c;很烦。如何对敌&#xff1f;当然是借助编程的力量了。 感谢大佬们的辛勤劳动…

中间件redis数据结构高阶面试

文章目录前言Redis是单线程吗&#xff1f;Redis 单线程为什么还能这么快&#xff1f;Redis 单线程如何处理那么多的并发客户端连接&#xff1f;其他高级命令前言 记录redis入门 Redis是单线程吗&#xff1f; Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线…

(vc++ 98版的 xp) C++如何实现ring0

offset SavedGate; movsd; movsd; } } void __fastcall TForm1::Button1Click(TObject *Sender) { GotoRing0(); } ebx; // 开始恢复原中断门 mov esi offset OurGate; movsd; movsd; int IntNo; mov edi ebx; mov esi ebx; movsd; movsd; mov edi offset SavedGate; mov esi I…

中间件Redis持久化方式

文章目录前言RDB&#xff08;Redis DataBase&#xff09;快照&#xff08;snapshot&#xff09;bgsave的写时复制(COW)机制AOF&#xff08;append-only file&#xff09;AOF重写RDB 和 AOF &#xff0c;我应该用哪一个&#xff1f;Redis 4.0 混合持久化Redis数据备份策略&#…

菜机互啄 linux 基础命令篇 持续更新中

LINUX 命令讲解篇 前言 Linux命令行有命令提示符&#xff0c;提示你可以输入指令 在linux之中用到最多的是两种用户 #&#xff1a;root 超级管理员 $:普通用户 命令格式&#xff1a; 指令 选项&#xff08;修改命令的执行特性&#xff09; …

中间件redis主从架构方式

文章目录前言Redis主从架构redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a;Redis主从工作原理主从复制(全量复制)流程图&#xff1a;数据部分复制主从复制(部分复制&#xff0c;断点续传)流程图&#xff1a;Jedis连接代码示例&#xff1a;redis管道与调用lua脚本&…

请问学C语言要学什么做基础

所以没有什么不可能 ||| 要学基础太多了大学的计算机基础课还是很有用的什么软件基础了 两个月会用C 一个月精通C 我就如此 有问题可以方便解决 ||| 不需要任何基础 去找本书吧 学好了 慢慢来 这讲究逻辑吧 你慢慢看 什么数据结构了等等 不难的一定要有老师教 刚开始多理解 在练…