JLOI棋局定式
在“jloi-08”游戏中,还存有非常非常多的棋局定式,也就是常会用到的下棋的组合。有时在学习一个著名棋局时,电脑会考一考刘先生:在这局棋里面,有多少个定式啊?分别是什么啊?
  
  对于30~40步的普通棋局,刘先生还能回答出来,可是有时候2个实力相当的大牛下的棋局,2000000步都有可能。如果电脑对这样的棋局提上面的问题时,刘先生就必须写一个程序来帮助自己了。可是,刘先生在这方面却…,怎么写也写不对。你能帮助刘先生吗?
  
  棋局是由很多step组成的,而step是由一个字符串组成的,比如Kh2或者是Nxb7。
前者表示K(king)移动至h2格,后者表示N(knight)移动至b7格并吃掉原有的棋子。
  
  第一个字符可能有6种:K Q B N R P,而后面可能是一个坐标或者是字符x后跟一个坐标。
  
  坐标是由一个小写英文字母(a~h)和一个数字(1~8)组成的。
  
  如果一个棋局中完整地并连续地包含一个定式中所有的step,那么这个棋局便包含这个定式。

输入格式:
  第一行2个整数n, m,表示定式的个数(1<=n<=2000)以及这个棋局所包含的步数
  
  下面的n个块(block),每块包含:
   第一行一个整数k表示定式包含的步数(1<=k<=100000, ∑k<=200000)
   第二行一个字符串表示该定式的名称(长度不超过50)
   下面的k行每行一个字符串表示定式中的一步
  
  最后的m行每行一个字符串,表示棋局中的一步
输出格式:
  按照输入文件包含的定式的顺序,输出棋局包含的所有定式的名称,一个一行。
样例输入:
2 5
3
King’s Knight Opening
Pe4
Pe5
Nf3
3
Nimzowitsch Variation
Pc4
Pe5
Nf3
Pe4
Pe5
Nf3
Nc6
Bb5
样例输出:
King’s Knight Opening
时间限制:
1000
空间限制:
512000

裸的AC自动机,复习了一下。结果常数写太大,过不了—

%:pragma GCC optimize(4)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<cstdlib>
#include<queue>
#include<new>
using namespace std;
#define N 1000001
int n,m;
struct AK_machine{int fail[N];bool vis[N];int sz,root;char mark[2001][2001];char xv[2001];int move[2001][2001];int redance[2000001];int len[2001];int cnt;vector<int>num[N];int ans;char c;map<int,int>son[N];map<int,int>::iterator it;int hash[128][128][128];int clf[N];int KO;void init(){for(int i=1;i<=10000;i++)son[0][i]=1;root=++sz;cnt=0;ans=0;KO=0;}void add(int x){scanf("%d",&len[x]);c=1;while(c!=10)c=getchar();cin.getline(mark[x],10001);int p=root;for(int i=1;i<=len[x];i++){int l=0;c=1;while(c!=10){c=getchar();if(c!=10)xv[l++]=c;}
//          scanf("%s",xv);if(l==2){xv[2]=xv[1];xv[1]='#';}if(!hash[xv[0]][xv[1]][xv[2]]) hash[xv[0]][xv[1]][xv[2]]=++cnt;move[x][i]=hash[xv[0]][xv[1]][xv[2]];if(!son[p][move[x][i]]){son[p][move[x][i]]=++sz;}p=son[p][move[x][i]];}num[p].push_back(x);}void dance(){queue<int>q;while(!q.empty())q.pop();q.push(root);fail[root]=0;while(!q.empty()){int xx=q.front();q.pop();for(it=son[xx].begin();it!=son[xx].end();it++){int a=it->first;int b=it->second;int u=fail[xx];while(!son[u].count(a)) u=fail[u];fail[b]=son[u][a];q.push(b);}}}void doit(){for(int i=1;i<=m;i++){int l=0;scanf("%s",xv);if(strlen(xv)==2){xv[2]=xv[1];xv[1]='#';}if(!hash[xv[0]][xv[1]][xv[2]]) hash[xv[0]][xv[1]][xv[2]]=++cnt;redance[i]=hash[xv[0]][xv[1]][xv[2]];}int temp=root,u=root,a,b,p=root;for(int i=1;i<=m;i++){int k=redance[i];while(!son[p].count(k)) p=fail[p];p=son[p][k];temp=p;while(temp){if(!vis[temp]){int ll=num[temp].size();for(int j=0;j<ll;j++){clf[++ans]=num[temp][j];}vis[temp]=1;}temp=fail[temp];}}sort(clf+1,clf+ans+1);for(int k=1;k<=ans-1;k++){int l=strlen(mark[clf[k]]);for(int j=0;j<l;j++) putchar(mark[clf[k]][j]);puts("");}int l=strlen(mark[clf[ans]]);for(int j=0;j<l;j++) putchar(mark[clf[ans]][j]);}
} fire_dancer;
int main()
{scanf("%d%d",&n,&m);fire_dancer.init();for(int i=1;i<=n;i++) fire_dancer.add(i);fire_dancer.dance();fire_dancer.doit();
}

MAP STL划水记,我们如果用!的形式就会强行增加一个元素,所以应该用count才能A

AC自动机——棋局定式相关推荐

  1. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

  2. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  3. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

  4. Keywords Search AC自动机QAQ

    AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...

  5. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  6. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

  7. HDU2896(AC自动机模版题)

    AC自动机模版题: 方法一:超时 #include<iostream> #include<algorithm> #include<cstring> #include ...

  8. HDU2222(AC自动机模版题)

    AC自动机是Trie树和KMP的结合物,但是其实KMP在这里体现了思想,而Trie树才是最重要的,要想学懂AC自动机,学习Trie树是必须的,这些是自己在学习AC自动机的个人看法,我也是在网上学习了大 ...

  9. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

最新文章

  1. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 )
  2. react map循环生成的button_关于Vue和React的一些对比及个人思考(中)
  3. 深度有趣 | 30 快速图像风格迁移
  4. 华为2014校园招聘的机试题目
  5. 批量创建10个系统帐号tianda01-tianda10并设置密码
  6. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验
  7. dpdk大页内存实现
  8. 期货反向跟单这个模式、大家目前都耳熟能详,操作原理也算是人尽皆知了!
  9. 几种取时间的方法(附代码)
  10. 【论文笔记(2)】图卷积网络介绍 Understanding Convolutions on Graphs
  11. win10 microsoft edge能上网,别的浏览器不能上网
  12. Android中m、mm、mmm、mma、mmma的区别
  13. 火爆!联想Z5首售15分钟全网告罄力夺京东单品榜冠军
  14. 计算机策略编辑器,组策略及组策略编辑器基础知识
  15. 3. Executors
  16. R语言-频数统计函数
  17. c语言判断获取位置字符,C语言 · 判定字符位置
  18. Microchip PIC系列8位单片机入门教程(一)开发环境建立
  19. centos7中journal和rsyslog日志
  20. 干货|一文读懂 Spring Data Jpa!

热门文章

  1. 广西铁路局计算机类待遇怎么样,南宁铁路局月薪待遇 如何进入铁路工作
  2. A卡 HD5770(HD6770) Readon HD 5xxx 6xxx系列显卡黑苹果MOJAVE CATALINA QE/CI驱动教程
  3. ext2.2全选反选修复
  4. JAVA_反射机制(照镜子)
  5. FT232RL USB串口与GP232RL软硬件兼容开发资料
  6. Eclipse界面风格调整
  7. 配置微信公众号业务域名,解决“非微信官方网页,请确认是否继续访问”问题
  8. Databricks文档04----使用 Azure Databricks 提取、转换和加载数据
  9. java当单据变化触发,UAP开发(NC63)遇到的错误记录
  10. 机器学习系列(4)_机器学习算法一览,应用建议与解决思路