http://poj.org/problem?id=1204

大意:给出一个棋盘puzzle,,和w个模式串,,在棋盘中寻找模式串。。棋盘中任意一格有8个方向可以走。。

解题思路: AC自动机 + 枚举8个方向即可

get_trie(),get_ac().直接用模版。。。。

query 有一点小技巧。。需要枚举8个方向,,对于一行,我们对竖直方向上的枚举可以省略,因为我们在竖直方向上枚举时,会补充上。。

另外 我们无需枚举一行中的每一个点,,只需第一个即可,因为,,我们在一个方向上枚举时,,会包含到后面的。

  1. #include <iostream>
  2. #include<cstring>
  3. using namespace std;
  4. struct point{
  5. point *fail;
  6. point *next[];
  7. bool istail;//是否为单词结尾
  8. int id;//单词的输入顺序
  9. point(){ //初始化
  10. istail =false;
  11. fail = NULL;
  12. memset(next,NULL,sizeof(next));
  13. }
  14. }*q[];//bfs 获得fail 用
  15.  
  16. struct pos{
  17. int x,y,dis;
  18. };
  19. pos ans[];
  20. point *root = NULL;
  21. int l,c,w;
  22. char map[][];//puzzle
  23. char str[];//模版串
  24. int len[];//记录每个摸版的长度
  25. int tail,head;
  26. int dix[][] = {-,,-,,,,,,,,,-,,-,-,-};//顺时针,,上下左右。。。八个方向
  27. char res[]={"ABCDEFGH"};
  28. void build_trie(char *str,int id){
  29. point *p = root;
  30. int i=,index;
  31. while(str[i]){
  32. index = str[i]-'A';
  33. if(p->next[index]==NULL) p->next[index] = new point();
  34. p = p->next[index];
  35. i++;
  36. }
  37. p->istail = true;
  38. p->id = id;
  39. }
  40. void get_ac(){
  41. int i;
  42. root->fail = NULL;
  43. q[head++] = root;
  44. while(head!=tail){
  45. point *temp = q[tail++];
  46. point *p =NULL;
  47. for(i=;i<;i++){
  48. if(temp->next[i]!=NULL){
  49. if(temp==root) temp->next[i]->fail=root;
  50. else{
  51. p = temp->fail;
  52. while(p!=NULL){
  53. if(p->next[i]!=NULL){
  54. temp->next[i]->fail = p->next[i];
  55. break;
  56. }
  57. p = p->fail;
  58. }
  59. if(p==NULL) temp->next[i]->fail = root;
  60. }
  61. q[head++] = temp->next[i];
  62. }
  63. }
  64. }
  65. }
  66.  
  67. void query(int x,int y,int i){
  68. int index;
  69. point *p,*qq;
  70. p = root;
  71. for(;map[x][y];x+=dix[i][],y+=dix[i][]){
  72. index = map[x][y]-'A';
  73. while(p->next[index]==NULL&&p!=root) p = p->fail;
  74. p = p->next[index];
  75. if(p==NULL)
  76. p = root;
  77. qq= p;
  78. while(qq!=root){
  79. if(qq->istail){
  80. qq->istail = false;
  81. ans[qq->id].x = x-dix[i][]*(len[qq->id]-)-;//从1开始记得数
  82. ans[qq->id].y = y-dix[i][]*(len[qq->id]-);
  83. ans[qq->id].dis = i;
  84. }
  85. qq = qq->fail;
  86. }
  87. }
  88. }
  89. int main()
  90. {
  91. root = new point();
  92. cin>>l>>c>>w;
  93. for(int i=;i<=l;i++)
  94. cin>>map[i];
  95. for(int i=;i<w;i++){
  96. cin>>str;
  97. len[i] = strlen(str);
  98. build_trie(str,i);
  99. }
  100. head = tail =;
  101. get_ac();
  102. for(int i=;i<=l;i++){//枚举水平
  103. query(i,,),query(i,,),query(i,,);//一行只需枚举开头和结尾即可,一列同样
  104. query(i,c-,),query(i,c-,),query(i,c-,);
  105. }
  106. for(int i=;i<c;i++){//枚举竖直
  107. query(,i,),query(,i,),query(,i,);
  108. query(l,i,),query(l,i,),query(l,i,);
  109. }
  110.  
  111. for(int i=;i<w;i++){
  112. cout<<ans[i].x<<" "<<ans[i].y<<" "<<res[ans[i].dis]<<endl;
  113. }
  114. return ;
  115. }

poj 1204的更多相关文章

  1. poj 1204 Word Puzzles(字典树)

    题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...

  2. 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)

    Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...

  3. [POJ 1204]Word Puzzles(Trie树暴搜&amp;AC自己主动机)

    Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...

  4. [poj] 1204 Word Puzzles || AC自动机

    原题 给个X*Y的字符串矩阵,W个询问,对每个询问输出这个串出现的位置及方向,共有8个方向,顺时针开始分别用A~H表示 AC自动机的板子题. 对于待匹配串建一个自动机,然后从矩阵的四周分别沿八个方向跑 ...

  5. POJ 1204 Word Puzzles | AC 自动鸡

    题目: 给一个字母矩阵和几个模式串,矩阵中的字符串可以有8个方向 输出每个模式串开头在矩阵中出现的坐标和这个串的方向 题解: 我们可以把模式串搞成AC自动机,然后枚举矩阵最外围一层的每个字母,向八个方 ...

  6. POJ 1204 Word Puzzles(AC自动机)

    这题的数据卡在,如下: 5 5 3 ABCDE FGHIJ KLMNO PQRST UVWXY PQR RS RST puzzle中间的行中可以包含要查询的多个单词.这个问题很好解决,SearchDf ...

  7. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  8. [转] POJ字符串分类

    POJ 1002 - 487-3279(基础)http://acm.pku.edu.cn/JudgeOnline/problem?id=1002题意:略解法:二叉查找数,map,快排... POJ 1 ...

  9. ACM 字符串 题目整理

    AC自动机 UVa 11468  Substring AC自动机+概率DP. 注意要补全不存在的边. 为什么要补全不存在的边呢?补全以后可以直接找到状态的转移,即从所有子节点就可以实现所有状态转移. ...

随机推荐

  1. kbengine简单介绍(1)

    什么是kbengine? 一款开源的游戏服务端引擎,客户端通过简单的约定协议就能与服务端通讯, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d-x, HTML5, 等 ...

  2. WebRTC学习笔记_Demo收集

    1.     WebRTC学习 1.1   WebRTC现状 本人最早接触WebRTC是在2011年底,那时Google已经在Android源代码中增加了webrtc源代码,放在/external/w ...

  3. 编译ycm库

    在安装完YCM之后,重新打开vim还会出现如下的报错信息:ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; ...

  4. OpenCV 开发环境环境搭建(win10+vs2015+opencv 3.0)

    OpenCV 3.0 for windows(下载地址:http://opencv.org/): 本测试中,OpenCV安装目录:D:\Program Files\opencv,笔者操作系统为64位. ...

  5. ExtJs目录说明

    Ext开发包目录结构说明builds目录为ExtJS压缩后的代码docs目录为ExtJS的文档examples目录中是官方的演示示例locale是多国语言的资源文件, 其中ext - lang - z ...

  6. Andy's First Dictionary

    Description Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy ...

  7. ButterKnife 绑定 RadioGroup

    原则上 ButterKnife 是不支持 RadioGroup 的, 可以通过以下方法添加RadioButton的点击事件: @OnClick({ R.id.radio_btn1, R.id.radi ...

  8. MFC 简单实现 DES 算法

    前言 徐旭东老师说过学者就应该对知识抱有敬畏之心,所以我的博客的标题总喜欢加上"简单"二字,就是为了提醒自己,自己所学知识只是皮毛,离真理还远矣. DES 算法 DES算法是密码体 ...

  9. JS性能

    获取以下属性  会等待对应元素渲染完成  才继续执行 * offsetTop, offsetLeft, offsetWidth, offsetHeight* scrollTop, scrollLeft ...

  10. Teclast/台电 P98HD四核测评9.7寸台电P98HD 评测体验 (转载)

    自从苹果新iPad上市推出后,拥有Retina高清屏幕分辨率的平板让我们的视线一下子变得“清晰”起来,超高2048x1536分辨率也成为厂商们追捧的对象,在经历了双核时代配备高清分辨率对于硬件性能承载 ...