写正文之前容我吐槽一发:HDU真坑爹啊!我在这上面交了两天不到的题什么错误都有啊!CE啊!变量名别整奇怪啊!万能库不认识啊!G++和C++不一样啊!PE啊,你最后一行给我少了个回车这是不行的啊!OLE啊!你说我手贱输出那么多值干嘛啊!卡你内存卡你初始化卡你字符串函数卡巴斯基啊!英文题面啊!ACM好厉害呀!去做个题读题时间最长啊!多组数据啊!初始化你也要想好那些需要啊!看不清楚就快滚蛋吧!地球太危险了你还是回火星吧!


传送门-P2222
题意:给一些子串和一个总串,问有多少个子串在总串中出现过
思路:AC自动机裸题,不想说什么
注意:千万别用memset!字符串取长度时先赋值到变量上!
代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int t,n,tot,root=1;
char s[53],ch[1000003];
int fail[500003],num[500003],trie[500003][26];
queue<int> q;
inline void insert(char s[])
{int now=root,len=strlen(s);for (int i=0;i<len;i++){if (!trie[now][s[i]-'a']) trie[now][s[i]-'a']=++tot;now=trie[now][s[i]-'a'];}num[now]++;
}
inline void build()
{int now=root;q.push(root);while (!q.empty()){now=q.front();q.pop();for (int i=0;i<26;i++)if (trie[now][i]){int tmp=fail[now];while (!trie[tmp][i]&&tmp) tmp=fail[tmp];if (now!=root&&tmp)fail[trie[now][i]]=trie[tmp][i];else fail[trie[now][i]]=root;q.push(trie[now][i]);}}
}
int main()
{scanf("%d",&t);while (t--){tot=1;scanf("%d",&n);while (n--){scanf("%s",s);insert(s);}build();scanf("%s",ch);int now=root,ans=0,len=strlen(ch);for (int i=0;i<len;i++){while (!trie[now][ch[i]-'a']&&now) now=fail[now];if (!now) now=root;else now=trie[now][ch[i]-'a'];int tmp=now;while (tmp!=root){ans+=num[tmp];num[tmp]=0;tmp=fail[tmp];}}printf("%d\n",ans);for (int i=1;i<=tot;i++){num[i]=fail[i]=0;for (int j=0;j<26;j++) trie[i][j]=0;}}
}

传送门-P2896
题意:是中文题面终于不用找翻译了哈哈
思路:记录编号与总数
注意:依旧卡内存,把你能想象到的技巧全用上吧!(为什么ASCLL不是0-255呢……)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,tot=1,root=1,ans;
int trie[100010][128],fail[100010],num[100010];
char s[10010];
bool flag[510];
queue <int> q;
void insert(int x,char s[])
{int len=strlen(s),now=root;for (int i=0;i<len;i++){if (!trie[now][s[i]]) trie[now][s[i]]=++tot;now=trie[now][s[i]];}num[now]=x;
}
void build()
{int now=root,tmp;q.push(now);while (!q.empty()){now=q.front();q.pop();for (int i=0;i<=127;i++)if (trie[now][i]){tmp=fail[now];while (tmp&&!trie[tmp][i]) tmp=fail[tmp];if (now!=root&&tmp) fail[trie[now][i]]=trie[tmp][i];else fail[trie[now][i]]=root;q.push(trie[now][i]);}}
}
bool solve(int x)
{scanf("%s",s);int tmp,len=strlen(s),now=root,cnt=0;memset(flag,0,sizeof(flag));for (int i=0;i<len;i++){while (now&&!trie[now][s[i]]) now=fail[now];if (!now) now=root;else now=trie[now][s[i]];tmp=now;while (tmp!=root){if (num[tmp]) cnt++,flag[num[tmp]]=1;tmp=fail[tmp];}}if (!cnt) return 0;printf("web %d:",x);for (int i=1;i<=n;i++)if (flag[i]) printf(" %d",i);puts("");return 1;
}
main()
{scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%s",s),insert(i,s);build();scanf("%d",&m);for (int i=1;i<=m;i++)if (solve(i)) ans++;printf("total: %d\n",ans);
}

传送门-P3065
题意:中文
思路:基本与上面相同,当主串中当前位置不是大写字母时可以直接跳回root
注意:多组数据!多组数据!题面中没说,但是多组数据!
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define pd(i) (i>='A'&&i<='Z')
using namespace std;
int n,root=1,tot=1;
char ch[1002][52],s[2000002];
int ans[50010],num[50010],fail[50010],trie[50010][26];
queue <int> q;
void insert(int x,char s[])
{int now=root,len=strlen(s);for (int i=0;i<len;i++){if (!trie[now][s[i]-'A']) trie[now][s[i]-'A']=++tot;now=trie[now][s[i]-'A'];}num[now]=x;
}
void build()
{int now=root,tmp;q.push(now);while (!q.empty()){now=q.front();q.pop();for (int i=0;i<26;i++)if (trie[now][i]){tmp=fail[now];while (tmp&&!trie[tmp][i]) tmp=fail[tmp];if (now!=root&&tmp) fail[trie[now][i]]=trie[tmp][i];else fail[trie[now][i]]=root;q.push(trie[now][i]);}}
}
void work()
{tot=1;memset(ans,0,sizeof(ans));memset(trie,0,sizeof(trie));memset(num,0,sizeof(num));for (int i=1;i<=n;i++)scanf("%s",ch[i]),insert(i,ch[i]);build();scanf("%s",s);int now=root,tmp,len=strlen(s);for (int i=0;i<len;i++){if (!pd(s[i])) {now=root;continue;}while (now&&!trie[now][s[i]-'A']) now=fail[now];if (!now) now=root;else now=trie[now][s[i]-'A'];tmp=now;while (tmp!=root){if (num[tmp]) ans[num[tmp]]++;tmp=fail[tmp];}}for (int i=1;i<=n;i++)if (ans[i])printf("%s: %d\n",ch[i],ans[i]);
}
main()
{while (scanf("%d",&n)!=EOF)work();
}

本来还想再放一道ZOJ上的题,但是它交不上!不是CE、RE,而是真的交不上!一交就出错!弃疗的我打了个A+B上用这个问题交了上去却能交上!!!

【多题合集】AC自动机练习,被HDU支配的恐惧相关推荐

  1. Coderforces 字符串水题合集

    今天我们聊聊 Coderforces 字符串水题合集. 字符串就是string. 这是string的百度翻译,我们要谈的是画框的.↓ string是C++.java.VB等编程语言中的字符串,字符串是 ...

  2. 计算机组成原理常考大题合集

    计算机组成原理常考大题合集 1.在"Cache-主存-辅存"三级存储体系中,"Cache-主存"结构与"主存-辅存"结构的引入为了解决什么问 ...

  3. 2020年前端面试之JS手写代码题合集

    2020年前端面试之JS手写代码题合集 预计会有上千道题,后续慢慢补! 1.  写一个把字符串大小写切换的方法 function caseConvert(str){return str.replace ...

  4. 大英赛C类翻译题合集

    大英赛C类翻译题合集 2012初赛 2013初赛 2013决赛 2014初赛 2014决赛 2012初赛 既然没有退路了,我们不妨试试他的方法.(might as well) Since there ...

  5. 备战网络工程师认证考试:历年真题合集

    备战网络工程师认证考试:历年真题合集 网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员.网络工程师能够从事计算机信息系统的设计.建设.运行和维护工作.参加全国计算机等级考试之 ...

  6. 网络安全web方向入门题合集

    网络安全web方向入门题合集 [HCTF 2018]WarmUp 验证 [极客大挑战 2019]EasySQL [极客大挑战 2019]Havefun [强网杯 2019]随便注 前期工作 堆叠注入查 ...

  7. HDLBits刷题合集—9 Arithmetic Circuits

    HDLBits刷题合集-9 Arithmetic Circuits HDLBits-66 Hadd Problem Statement 创建一个半加器.半加器将两个输入(不带低位的进位)相加产生和和向 ...

  8. UVA11019 Matrix Matcher【hash傻逼题】【AC自动机好题】

    LINK1 LINK2 题目大意 让你在一个大小为\(n*m\)的矩阵中找大小是\(x*y\)的矩阵的出现次数 思路1:Hash hash思路及其傻逼 你把一维情况扩展一下 一维是一个bas,那你二维 ...

  9. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附权威答案)

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

最新文章

  1. 90.前端 :执行方法前提示功能
  2. python学习之路
  3. eclipse基本断点调试
  4. PMCAFF微课堂 | SegmentFault联合创始人高阳带你玩转垂直社群
  5. 腾讯云【人脸识别】服务的一次尝试(JAVA)
  6. python点击按钮创建进程_python-创建进程的三种方式
  7. MFC中的几种播放声音的方法
  8. Node.js下载安装及各种npm、nvm、nrm配置(保姆式教程---提供全套安装包)---node.js的安装与配置(1)
  9. 理想制动力分配曲线matlab源代码_宝马进入“血拼”状态,动力倍儿棒
  10. sql server insert 锁表_SQL Server的insert执行的秘密(下) 带外键的insert分析
  11. 废话少说 分析java抽象类与接口的区别
  12. 将你的blog变成英文版
  13. 经典算法书籍推荐(亲测有效)
  14. 新西兰计算机预科学费多少钱,去新西兰读预科需要多少费用?
  15. 机器学习之CART树
  16. 影像数据的分辨率与比例尺关系
  17. pandas str方法的使用
  18. WEB漏洞之:海洋CMS代码执行(CNVD-2020-22721)
  19. MMC 开发浅谈 - 准备篇(学习资料与配置环境)
  20. 如何根据PPI网络进一步挖掘信息

热门文章

  1. 一条数据的HBase之旅,简明HBase入门教程4:集群角色
  2. php二分法 冒泡 快速排序,PHP 常见算法【冒泡排序, 快速排序, 插入排序, 取舍排序, 二分法查找, .】...
  3. poj 1733 ParityGame 并查集 离散化
  4. pycharm不能输入代码或删除代码
  5. Visual Studio注释快捷键
  6. HTML5新属性 Canves的整体学习
  7. 拟牛顿法matlab程序_牛顿环实验的数据处理改进及图像分析
  8. python123百钱买百鸡_day01笔记-百钱买百鸡(100文钱,必须买100只鸡,有几种方式)
  9. thinkpad10平板 linux,联想ThinkPad 10平板亮相官网 或售8445
  10. php时间转两位数年份,PHP常用时间函数资料整理