AC 自动机 水题 hdu 3065

AC自动机模板+例题(HDU2896+HDU3065+HDU2222) 病毒侵袭中(HDU2896) #include<map> #include<cmath> #include<queue> #include<vector> #include<cstdio> #include<string> #include<cstdlib> #include<cstring> ... 阅读详情

AC自动机 :

AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。

在学习 AC 自动机 之前 , 一般应先学会 字典树 (也就是 tire树 ) 和 KMP 算法 (fail指针的构造 就是这个思想)。

用模拟指针实现的AC自动机

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 10000100;
struct Node {
   int num, fail;
   int next[26];
   void init  (){
     for(int i = 0; i<=25 ; i++){
        next[i] = 0;
     }
     fail = -1;
     num = 0;
   }
}node [maxn];

int n;
char s[1010][55];
int tot = 0 ;
void insert(char s[]){
    int cur = 0;
    for(int i=0;s[i];i++){
       // cout << s[i]<<" ***";
       int t = s[i] - 'A' ;
       if(node[cur].next[t]){
          cur = node[cur].next[t];
     // cout << "cur:" <<cur <<endl;
       }else{
         node[cur].next[t] = ++tot;
     node[tot].init();
     cur = tot;
       }
    }
}
void get_fail (){
  queue<int > Q;
  Q.push(0);
  while(!Q.empty()){
      int now = Q.front();
      Q.pop();
      for(int i= 0;i<26;i++){
          if(node[now].next[i]){
//          cout <<"haha"<<endl;
           int p = node[now].fail ;
           int q = node[now].next[i];
              while(p!=-1&& !node[p].next[i]){
            p = node[p].fail;
          }
          if(p == -1 ) node[q].fail  = 0;
              else { node[q].fail = node[p].next[i];
//            cout <<q<<"fail "<< node[q].fail<<endl;
          }
          Q.push(q);
      }
      }
  }
}
void match (char s[]){
    int len = strlen(s);
    int rt = 0 ;
    int p,ans;
    for(int i=0 ;i < len ; i++){
//        cout << s[i]<<"&&&& "; 
      int t = s[i]-'A';
      if(t>25||t<0){
        rt = 0 ;
    continue;
      }
      p = rt ;
      while(p!=-1&& !node[p].next[t]){
         p = node[p].fail;
      }
      if(p==-1) rt = 0 ;
      else rt = node[p].next[t];
      node[rt].num ++ ;
   //   cout <<rt << "rt"<<endl;
    }
}
int query(char s[]){
    int p= 0 , rt= 0 ;
    for(int i= 0 ;s[i];i++){
         int t = s[i] - 'A';
     if(node[p].next[t]){
         p = node[p].next[t];
     }else{
      return 0 ;
     }
    }
    return node[p].num;
}
char  mode[2000100];
int main(){
   while( ~scanf("%d",&n)){
  for(int i=1;i<=n;i++){
     scanf("%s",s[i]);
  }
  node[0].init();
  tot = 0;
  for(int i=1;i<=n ;i++){
     insert(s[i]);
  } 
  get_fail();
 // cout <<"***"<<endl;
  scanf("%s",mode);
  match(mode);
 // cout <<"**(()"<<endl;
  for(int i=1;i<= n;i++){
//      cout <<s[i]<<endl;
      int ans = query(s[i]);
  //    cout << ans <<endl;
      if(ans){
         cout << s[i]<<": "<<ans<<endl;
      }
   }
 }
 return  0;
}



AC自动机详解+例题详解 关于AC自动机的详细的讲解+标程,还有一些例题的讲解。 立即下载

相关推荐

URP Shader编程之自定义后处理单pass渲染(URP 14.x)

❌ 不要在里拿✅ 只在里拿RendererFeature 生命周期RTHandle 设计Blitter 的真实语义Shader 输入来源。

qq1342753906的博客 608

最近网络流AC题目总结(水题版)

1.【模板】网络最大流 这个题目是模板啊,没什么好总结的,只要会EK或Dinic或Isap就可以了,我不会Isap啊,代码什么的在这里点击 我是链接 2. [USACO4.2]草地排水Drainage Ditches 这个题依然是模板啊,m是点,n是边,跑1到n的最短路就A了啊 1 // luogu-judger-enable-o2 2 #include &lt...

weixin_30362801的博客 176

【QGIS】利用“创建网格”功能实现区域等距分割与坐标转换实战

本文详细介绍了如何在QGIS中使用“创建网格”工具实现区域等距分割。通过实战演示,将北京市行政区划切割为150米正方形网格,并重点讲解了关键步骤:选择投影坐标系EPSG:3857以确保网格尺寸精确,以及将结果转换为常用的WGS84经纬度坐标。文章还涵盖了进阶技巧与常见问题解决方案,帮助用户高效完成空间网格化分析任务。

weixin_29232507的博客 96

HDU2222 AC自动机水题 (Trie图优化)

#include #include #include #include #include #define For(i,j,k) for (i=j;i<=k;i++) using namespace std; struct node{ int count,flag; bool r; struct node *next[26],*fa,*fail; node(){ co

Free Loop~~~跳动的恒星 597

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 236

原理图转PCB

本文讲述了原理图的编译、原理图转PCB的步骤和易错点。

m0_58083051的博客 3292

AC自动机例题荟萃

洛谷P3808 【模板】AC自动机(简单版), 洛谷P3796 【模板】AC自动机(加强版) 模板体,不会看看题解吧 hdu2222 Keywords Search 模板题,呃,放个ac代码 #include<bits/stdc++.h> using namespace std; const int maxn=1000010; const int maxm=5005...

Robert_6277的博客 317

Blender----利用DEM(tif)生成三维模型

利用DEM(tif)生成三维模型

LongJ_Sir的博客 5428

AC自动机水题

近日复习下AC机,顺便把以前的指针写法改成数组写法,删了以前的AC机相关博文(代码库2333),原本的指针写法实在太长了,而且内存下不来,随随便便就MLE。

某科学的程序员 1062

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

weixin_45735391的博客 8万+

SPICE仿真软件:Ngspice_(2).安装与配置

在Netlist文件中直接定义模型。V1 1 0 5R1 2 0 1k* Analysis库文件中可以包含多种电路元件模型和参数。

kkchenjj的博客 1586

HDU 3065 (AC自动机水题)

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11454    Accepted Submission(s): 4014 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题。

I good vegetable a! 449

Ubuntu-22.04安装VMware虚拟机并安装Windows10

最近在研究虚拟机,主要集中在KVM、Virtualbox和VMware这三种虚拟机上。前面我已经研究了前两种虚拟机的安装和使用方式,这篇文章介绍3兄弟中最后一个虚拟机安装和使用方式。Virtualbox虚拟机安装和使用KVM虚拟机安装和使用相比于前两种,VMware的安装方式最麻烦,但是综合体验下来我感觉流畅度最好。如果你确实有在Linux上使用VMware虚拟机的需求,那不妨跟着我看下去吧。1、gcc版本和内核版本一定要匹配上,否则会出各种错误。

jiexijihe945的博客 4118

hdu-3065(AC自动机)

Hdu-3065 思路: 考虑所有的ASCII字符的情况,用26范围内可能出错。 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const in...

积少成多,水滴石穿 402

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

HDU2896 HDU3065(AC自动机)

HDU2896 题意 求目标串中出现了几个给定的子串. 思路 ac自动机模板题(). 代码 #include<bits/stdc++.h> using namespace std; struct Trie { int next[105010][130],fail[105010],end[105010]; int root,L; int newnode()...

Do It Youself! 169

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

AC自动机 入门练习题

洛谷日报 强势图解AC自动机 https://www.luogu.com.cn/blog/3383669u/qiang-shi-tu-xie-ac-zi-dong-ji AC自动机-多模式匹配算法 https://blog.youkuaiyun.com/xaiojiang/article/details/52299258 AC 自动机 - OI Wiki https://oi-wiki.org/string/ac-automaton/ ...

nefu_ljw的博客 1342

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【AC自动机_每个模式串在文本串中出现的次数】HDU 3065 病毒侵袭持续中

HDU 3065 病毒侵袭持续中 题意:给出n个全是英文大写字母的模式串,保证每个模式串不完全相同。然后再给出一个文本串,字符集由包含ASCII可见字符组成。问每个模式串在文本串中出现的次数。 一: 思路:其实就是一个AC自动机的板子???只是分别统计了每个模式串出现的次数而已???真的是这样!!!!!我真的迷…… #include <iostream> #include...

L_X_ 364

AC自动机入门 - HDU3065 病毒侵袭持续中

AC自动机的模板题。 HDU3065 病毒侵袭持续中 题意:给定n个字符串和一段文本,统计每个字符串在文本中分别出现的次数。 注意点:这里输入单词的时候给每个单词分布一个id,然后在统计次数的时候根据id增加数组的次数就可以了。(这里用kuangbin大神的模板) code: #include #include #include #include using namespa

Exchan 384

AC自动机 HDU3065

自动机水题  注意多组输入!!!! #include using namespace std; int ans[1001],n; char buf[2000010],str[1001][55]; struct Trie { int next[50001][128],fail[50010],end[50001]; int root,L; int newnode()

Rain Stopped的博客 606

hdu 3065病毒侵袭持续中(ac自动机)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3065 中文题题意不解释了。 依旧稍微改一下ac自动机模版就能过了。还有一个坑点!是多组数据!!! #include <iostream> #include <cstring> #include <cstdio> #include <...

awow80285的博客 73

AC自动机(hdu 2896 hdu 3065)

题目:hdu 2896 题意:中文题目,可自己理解,简单说就是给定一些子字符串,再给出一些母字符串,找出母字符串中包含哪些子字符串 题解:AC自动机模板题 代码: 动态申请: #include #include #include #include #include #include #define MAX 59999 using namespace std; struct Node {

M_GSir的博客 389

HDU 3065 病毒侵袭持续中 (AC自动机)

题目地址:HDU 3065 裸的AC自动机。由于AC自动机的指针是不断回溯的,所以对于AA在AAA中算两次的问题完全不用担心,当在第二个A中+1后,指针会再次回溯到A上,然后当到第三个A的时候,会再记录一次。 代码如下:#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algo

scf0920 762

ac自动机题集和应用

最近需要使用ac自动机。补了一下算法。 https://www.cnblogs.com/sclbgw7/p/9260756.html https://www.cnblogs.com/sclbgw7/p/9875671.html 大佬的博客 下面说自己的心得(算法的理解要等我多刷一些题在写。) 1 大佬博客说的 辅助根优化,我没有发现。正常的字典树不都是有一个根么。ac自动机也用0做根,没毛病啊。 ...

天与云与山与水 347

hdu 3065 病毒侵袭持续中 ac自动机模板题

窝今天果断翻了SB,main函数中忘记写ac.bfs()这句话了,然后各种单步调试感觉怎么这个fail数组那么奇怪呢...很无语...后来不小心发现了果断AC,基本和上一道题类似,不过就是第几个字符串出现几次就对应的下标++,最后输出就好了。 #include #include #include #include #include #include #include #include using

384

hdu3065 AC自动机

挺裸的一个AC自动机的题,但是网上的题解基本都有些问题,主要有两个,一个是在沿fail指针向上更新时很多人都是遇到节点的count为0时直接跳出的,这没有任何道理吧。。。还有一个就是就算不直接跳出来遇到极限数据这样做也会TLE,我们应该先跑一边自动机,跑的时候不要沿fail指针向上更新,我们最后才按节点的拓扑序一次统计。不过这题数据太弱了怎么做都能过就是了。。。    #include #in

coding my life 791

hdu3065(AC自动机)

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10134    Accepted Submission(s): 3559 Problem Description 小t非常感谢大家帮忙解决了他的上一

Water_Wood_的博客 648
上一篇: hdu 1251 字典树的水题
下一篇: hdu 2222 AC自动机 。。
OceanLight
博客等级 码龄14年 21粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值