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

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

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

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1100000
using namespace std;
const char BASE='A';
char str[][];
int len,n,m,p,stx,sty;
int as1[],as2[],as3[];
int dir[][]={{-,},{-,},{,},{,},{,},{,-},{,-},{-,-}};
bool vis[maxn];
int head[maxn]; // head[i]为第i个结点的左儿子编号
int next[maxn]; // next[i]为第i个结点的右兄弟编号
int id[maxn];
char ch[maxn]; // ch[i]为第i个结点上的字符
int sz; // 结点总数
void init(){
sz = ;
memset(head,,sizeof(head));
memset(next,,sizeof(next));
}
void insert(const char *s,int to,int num) {
int u = , v;
for(int i =; i <to; i++) {
bool found = false;
for(v = head[u]; v != ; v = next[v])
if(ch[v] == s[i]) { // 找到了
found = true;
break;
}
if(!found) {
v = ++sz; // 新建结点
ch[v] = s[i];
next[v] = head[u];
head[u] = v; // 插入到链表的首部
head[v] = ;
}
u = v;
}
id[sz]=num;
}
void DFS(int u,int x,int y,int num){
if(!u||x<||x>=n||y<||y>=m)return;
int v=;
for(v=head[u]; v!= ; v = next[v])
if(ch[v] == str[x][y]) { // 找到了
break;
}
if(id[v]){
int tt=id[v];
as1[tt]=stx,as2[tt]=sty,as3[tt]=num;
id[v]=;
}
DFS(v,x+dir[num][],y+dir[num][],num);
}
char temp[];
int main(){
while(~scanf("%d%d%d",&n,&m,&p)){
for(int i=;i<n;i++){
scanf("%s",str[i]);
}
init();
memset(vis,,sizeof(vis));
memset(id,,sizeof(id));
for(int i=;i<=p;i++){
scanf("%s",temp);
vis[temp[]-BASE]=;
insert(temp,strlen(temp),i);
}
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(vis[str[i][j]-BASE]){
for(int k=;k<;k++){
stx=i,sty=j;
DFS(,i,j,k);
}
}
}
}
for(int i=;i<=p;i++){
printf("%d %d %c\n",as1[i],as2[i],as3[i]+'A');
}
}
}

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. 集合练习——List部分

    利用ArrayList 1.存储多个员工信息,包括工号,姓名,年龄,入职时间,逐条打印所有员工姓名,并输出员工个数. package CollectionPart; import java.util. ...

  2. 一个项目覆盖CS所有课程的可行性探究

    我们先看计算机科学有哪些子领域. 学术领域有: 计算理论 信息和编码理论 算法和数据结构 形式化方法 程序设计语言 实践领域有: 计算机体系结构 并行计算和分布式系统 实时系统和嵌入式系统 操作系统 ...

  3. 微信小程序开闸,关于入口、推广、场景的一些观察与思考

    今夜(1月9号)零点,微信小程序正式上线.在体验了很多款小程序后,我对小程序的使用场景有了更多的认识.以下是一些想法,欢迎交流. 一.小程序的"入口"在哪儿? 1.只有访问过的小程 ...

  4. 使用XMl序列化器生成xml文件

    生成XML文件 创建几个虚拟的短信对象,存在list中 备份数据通常都是备份至sd卡 使用StringBuffer拼接字符串 把整个xml文件所有节点append到sb对象里 sb.append(&q ...

  5. WebSocket 实战

    http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/ 本文介绍了 HTML5 WebSocket 的由来,运作机制及客户端和服务端的 AP ...

  6. MathType支持64位 WIN 7Office 2013(完美解决)(转载)

    经过几次尝试解决了,方法如下: 1. 安装MathType 6.8 (别的版本不知是否适用,本人安装的是该版本) 2. 将以下两个文件拷贝出来 C:\Program Files (x86)\MathT ...

  7. linux命令行执行db2存储过程

    存储过程代码如下: CREATE PROCEDURE proc_sum2(IN n INT,OUT sum INT,OUT j INT) BEGIN DECLARE i INT; ; ; ; WHIL ...

  8. bzoj1008: [HNOI2008]越狱

    思路:首先所有情况就是m^n,然后不可能发生越狱的情况就是第一个有m种选择,第二个要与第一个不同就是m-1种选择,第三个要与第二个不同也是m-1种选择,然后不可能发生越狱的情况数就是m*(m-1)^( ...

  9. Gradle实战教程之依赖管理

    这是从我个人网站中复制过来的,原文地址:http://coolshell.info/blog/2015/05/gradle-dependency-management.html,转载请注明出处. 简要 ...

  10. C++学习指南

    转载于stackoverflow:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list 感谢Ge ...