[JSOI2012]玄武密码 题解(AC自动机)
显然是AC自动机对吧
插入单词之后把文章在自动机上跑一遍,到达过的节点打上花火标记
之后检查一下每个单词有几个标记即可
可以把题目中的4个字母映射成abcd方便遍历
一定要记得把文章也映射啊!
#include<cstdio> #include<iostream> #include<cstring> #include<queue> using namespace std; const int N=1e7+5; char word[100005][105],s[N]; int n,m; char mapping(char ch) {switch(ch){case 'E':return 'a';break;case 'S':return 'b';break;case 'W':return 'c';break;case 'N':return 'd';break;} } struct AC_auto {struct node{node *son[7],*fail,*fa;int size;bool v;node(){memset(this,0,sizeof(node));}};node *root;void ini(){root=new node;}void ins(char *str){int l=strlen(str+1);node *now=root;for(int i=1;i<=l;i++){if(!now->son[str[i]-'a'])now->son[str[i]-'a']=new node();now=now->son[str[i]-'a'];}now->size++;}void build(){queue<node*> q;for(int i=0;i<4;i++){if(root->son[i]){q.push(root->son[i]);root->son[i]->fail=root;}else root->son[i]=root;}while(!q.empty()){node *x=q.front();q.pop();for(int i=0;i<4;i++){if(x->son[i]){x->son[i]->fail=x->fail->son[i];q.push(x->son[i]);}else x->son[i]=x->fail->son[i];}}}void query(char *str){node *now=root;int l=strlen(str+1),i=1;while(i<=l){now=now->son[str[i]-'a'];if(!now)return ;for(node *j=now;j!=root&&j->size!=-1;j=j->fail)j->size=-1;i++;}}int ans(char *str){node *now=root;int l=strlen(str+1),i;for(i=1;i<=l;i++){if(now->son[str[i]-'a']->size>=0)break;now=now->son[str[i]-'a'];}return i-1;} }ac; int main() {scanf("%d%d%s",&n,&m,s+1);for(int i=1;i<=n;i++)s[i]=mapping(s[i]);//Don't forget it! ac.ini();for(int i=1;i<=m;i++){scanf("%s",word[i]+1);int l=strlen(word[i]+1);for(int j=1;j<=l;j++)word[i][j]=mapping(word[i][j]);ac.ins(word[i]);}ac.build();ac.query(s);for(int i=1;i<=m;i++)printf("%d\n",ac.ans(word[i]));return 0; }
转载于:https://www.cnblogs.com/Rorschach-XR/p/11021952.html
[JSOI2012]玄武密码 题解(AC自动机)相关推荐
- 【BZOJ4327】[JSOI2012] 玄武密码(AC自动机的小应用)
点此看题面 大致题意: 给你一个长度为lenlenlen的文本串和nnn个模式串,让你求出每一个模式串的前缀与文本串的最大匹配串长度(其中模式串和文本串都只由字符'E','S','W','N'组成). ...
- 【题解】「JSOI2012」玄武密码(AC自动机)
题面 [题目描述] 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年 ...
- 【BZOJ4327】JSOI2012 玄武密码 AC自动机
[BZOJ4327]JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...
- 【bzoj4327】JSOI2012 玄武密码 AC自动机
题目描述 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. 很多年后,人们 ...
- bzoj4327: JSOI2012 玄武密码 AC自动机
bzoj4327: JSOI2012 玄武密码 Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香 ...
- [FROM WOJ]#3744 JSOI2012 玄武密码
#3744 JSOI2012 玄武密码 题面 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神 ...
- P5231 [JSOI2012]玄武密码(SAM 经典运用)
[JSOI2012]玄武密码 题目背景 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天 ...
- BZOJ 4327 [JSOI2012]玄武密码 (AC自动机)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4327 题解: 做法挺显然,建出AC自动机之后在上面跑,标记所有走过的点,然后再进行递推 ...
- BZOJ4327 : JSOI2012 玄武密码
对所有询问串建立AC自动机. 然后将母串在AC自动机上跑,每走到一个点x,从x点出发沿着fail指针能到的所有前缀都是匹配成功的,暴力向上走,碰到走过的就break,这样每个点最多只会被标记一次. 时 ...
- BZOJ4327:[JSOI2012]玄武密码(SAM)
Description 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
最新文章
- 如何在Mac下显示Finder中的所有文件
- 使用测试工具解决产品问题(译)
- 项目: 实时钟表(C语言)
- wordpress漏洞_WordPress站点恶意JS注入漏洞分析
- ONNX系列一 --- 带有ONNX的便携式神经网络
- oracle表,视图,存储过程,函数,序列.....查询
- 高中计算机编程软件vb,高中年级VB程序设计全套教案.doc
- Java IO流(精简版)
- c语言自学文档,自学c语言(全套资料)
- 黑苹果双系统时间不一致_黑苹果系统与windows时间差问题的解决
- ue4创建c++类编译失败
- 现代企业管理的12法宝(zt)
- bulter机器人_机器人库早报|特拉华大学通过人工智能扩大发展劳动力 1.5 倍
- bzoj-4318 OSU! 【数学期望】
- 一般人我不告诉的bug
- 洛谷 P2440 木材加工(二分,含边界处理的笔记)
- python xlutils模块安装_python接口测试,第三方包xlrd和xlutils,怎么安装
- 9.9 力扣652. 寻找重复的子树
- ios和Android端ijkplayer集成及使用
- Elias Kiritsis《String Theory in a Nutshell》(埃利亚斯·基里西斯《简明弦论》)中文目录
热门文章
- sql union用法和sql union all用法,sql union效率
- 收下这10个终身学习资源号,Max你的工作效率
- 如何在一场面试中展现你对Python的coding能力?
- bugku-管理员登录-(X-forwarded-for)
- 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10
- vue-cli工具搭建vue-webpack项目
- 关于console.log() 打印得引用类型得数据得相关问题
- jquery+thinkphp实现跨域抓取数据的方法
- touch事件详解【译文】
- [转]java中的io笔记