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

题意:给你n*m的字符串矩阵,然后p个查询,每个查询会给出一个字符串,然后问你在矩阵中能否通过8个方向搜索到这个字符串,输出地点以及搜索的方向。

题解:这里的思想真的很好。离线,把要查询的字符串插入trie树中,然后在矩阵中暴力查询查询。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define maxn 1100000
  6. using namespace std;
  7. const char BASE='A';
  8. char str[][];
  9. int len,n,m,p,stx,sty;
  10. int as1[],as2[],as3[];
  11. int dir[][]={{-,},{-,},{,},{,},{,},{,-},{,-},{-,-}};
  12. bool vis[maxn];
  13. int head[maxn]; // head[i]为第i个结点的左儿子编号
  14. int next[maxn]; // next[i]为第i个结点的右兄弟编号
  15. int id[maxn];
  16. char ch[maxn]; // ch[i]为第i个结点上的字符
  17. int sz; // 结点总数
  18. void init(){
  19. sz = ;
  20. memset(head,,sizeof(head));
  21. memset(next,,sizeof(next));
  22. }
  23. void insert(const char *s,int to,int num) {
  24. int u = , v;
  25. for(int i =; i <to; i++) {
  26. bool found = false;
  27. for(v = head[u]; v != ; v = next[v])
  28. if(ch[v] == s[i]) { // 找到了
  29. found = true;
  30. break;
  31. }
  32. if(!found) {
  33. v = ++sz; // 新建结点
  34. ch[v] = s[i];
  35. next[v] = head[u];
  36. head[u] = v; // 插入到链表的首部
  37. head[v] = ;
  38. }
  39. u = v;
  40. }
  41. id[sz]=num;
  42. }
  43. void DFS(int u,int x,int y,int num){
  44. if(!u||x<||x>=n||y<||y>=m)return;
  45. int v=;
  46. for(v=head[u]; v!= ; v = next[v])
  47. if(ch[v] == str[x][y]) { // 找到了
  48. break;
  49. }
  50. if(id[v]){
  51. int tt=id[v];
  52. as1[tt]=stx,as2[tt]=sty,as3[tt]=num;
  53. id[v]=;
  54. }
  55. DFS(v,x+dir[num][],y+dir[num][],num);
  56. }
  57. char temp[];
  58. int main(){
  59. while(~scanf("%d%d%d",&n,&m,&p)){
  60. for(int i=;i<n;i++){
  61. scanf("%s",str[i]);
  62. }
  63. init();
  64. memset(vis,,sizeof(vis));
  65. memset(id,,sizeof(id));
  66. for(int i=;i<=p;i++){
  67. scanf("%s",temp);
  68. vis[temp[]-BASE]=;
  69. insert(temp,strlen(temp),i);
  70. }
  71. for(int i=;i<n;i++){
  72. for(int j=;j<m;j++){
  73. if(vis[str[i][j]-BASE]){
  74. for(int k=;k<;k++){
  75. stx=i,sty=j;
  76. DFS(,i,j,k);
  77. }
  78. }
  79. }
  80. }
  81. for(int i=;i<=p;i++){
  82. printf("%d %d %c\n",as1[i],as2[i],as3[i]+'A');
  83. }
  84. }
  85. }

Word Puzzles的更多相关文章

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

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

  2. pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!

    /** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...

  3. poj1204 Word Puzzles

    Word Puzzles Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12090   Accepted: 4547   S ...

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

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

  5. POJ 题目1204 Word Puzzles(AC自己主动机,多个方向查询)

    Word Puzzles Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10244   Accepted: 3864   S ...

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

    题目大意:原题链接 给定一个字符串矩阵和待查找的单词,可以朝8个不同的方向查找,输出待查找单词第一个字母在矩阵中出现的位置和该单词被查到的方向. A~H代表8个不同的方向,A代表正北方向,其他依次以4 ...

  7. POJ1204 Word Puzzles(AC自动机)

    给一个L*C字符矩阵和W个字符串,问那些字符串出现在矩阵的位置,横竖斜八个向. 就是个多模式匹配的问题,直接AC自动机搞了,枚举字符矩阵八个方向的所有字符串构成主串,然后在W个模式串构造的AC自动机上 ...

  8. 【POJ】1204 Word Puzzles

    这道题目各种wa.首先是错了一个坐标,居然没测出来.然后是剪枝错误.搜索pen时就返回,可能还存在串pen*. #include <cstdio> #include <cstring ...

  9. poj 1204 Word Puzzles(字典树)

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

随机推荐

  1. javascript实现可编辑的下拉框

    曾经遇到过一个需求的情况是这样的,我们提供给用户的输入框的可选择项只能满足用户的大部分情况的选择,但是有时候会遇到一些用户想要输入的数据是下拉项中所没有的,而用户不希望改变下拉项为输入框模式,需要说如 ...

  2. VOL.2 IE6,7,8(windows vista/7 x86/x64 )单文件版三连发,欢迎大家分享

    在上期 VOL.1 利用vmware ThinApp 制作非XP下可以运行的IE6 [无插件版](windows vista/7/8  x86/x64 )中,简要介绍了如何利用vmware Thina ...

  3. jQuery 序列化表单 serialize() serializeArray()

    1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用 ...

  4. 20160501--struts2入门2

    一.Action名称的搜索顺序 1.获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action   2.首先寻找name ...

  5. Ext.Net学习笔记04:Ext.Net布局

    ExtJS中的布局功能很强大,常用的布局有border.accordion.fit.hbox.vbox等,Ext.Net除了将这些布局进行封装以外,更是对border进行了一些非常实用的改进,让我们来 ...

  6. 响应者链 hittest:withEvent: 方法的使用

    关于响应者链部分的基础内容 参考http://www.cnblogs.com/wendingding/p/3795171.html 这里我要说明的是 关于- (UIView *)hitTest:(CG ...

  7. 04_天气查询_JAX-WS方式_服务端

    [简述] WebService的Java实现共有三种方式:JAX-WS(JAX-RPC).JAXM&SAAJ.JAX-RS. JAX-WS: JAX-WS  的全称为 Java API for ...

  8. (zzuli)1907 小火山的宝藏收益

    Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏, ...

  9. PHP CURL参数详解

    curl用法:cookie及post 一.cookie用法 <?php $cookie_jar = tempnam('./tmp','cookie'); // login $c=curl_ini ...

  10. .NET 中String类功能分类概述

    一.比较功能 String.Compare: 成员函数 返回值 功能 String.Compare 小于零.零.大于零. 1.比较两个字符串的大小(按照一定规则) 2.比较两个字符串中子字符串的大小. ...