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

Description

Word puzzles are usually simple and very entertaining for all ages. They are so entertaining that Pizza-Hut company started using table covers with word puzzles printed on them, possibly with the intent to minimise their client's perception of any possible delay in bringing them their order.

Even though word puzzles may be entertaining to solve by hand, they may become boring when they get very large. Computers do not yet get bored in solving tasks, therefore we thought you could devise a program to speedup (hopefully!) solution finding in such puzzles.

The following figure illustrates the PizzaHut puzzle. The names of the pizzas to be found in the puzzle are: MARGARITA, ALEMA, BARBECUE, TROPICAL, SUPREMA, LOUISIANA, CHEESEHAM, EUROPA, HAVAIANA, CAMPONESA. 

Your task is to produce a program that given the word puzzle and words to be found in the puzzle, determines, for each word, the position of the first letter and its orientation in the puzzle.

You can assume that the left upper corner of the puzzle is the origin, (0,0). Furthemore, the orientation of the word is marked clockwise starting with letter A for north (note: there are 8 possible directions in total).

Input

The first line of input consists of three positive numbers, the number of lines, 0 < L <= 1000, the number of columns, 0 < C <= 1000, and the number of words to be found, 0 < W <= 1000. The following L input lines, each one of size C characters, contain the word puzzle. Then at last the W words are input one per line.

Output

Your program should output, for each word (using the same order as the words were input) a triplet defining the coordinates, line and column, where the first letter of the word appears, followed by a letter indicating the orientation of the word according to the rules define above. Each value in the triplet must be separated by one space only.

Sample Input

20 20 10
QWSPILAATIRAGRAMYKEI
AGTRCLQAXLPOIJLFVBUQ
TQTKAZXVMRWALEMAPKCW
LIEACNKAZXKPOTPIZCEO
FGKLSTCBTROPICALBLBC
JEWHJEEWSMLPOEKORORA
LUPQWRNJOAAGJKMUSJAE
KRQEIOLOAOQPRTVILCBZ
QOPUCAJSPPOUTMTSLPSF
LPOUYTRFGMMLKIUISXSW
WAHCPOIYTGAKLMNAHBVA
EIAKHPLBGSMCLOGNGJML
LDTIKENVCSWQAZUAOEAL
HOPLPGEJKMNUTIIORMNC
LOIUFTGSQACAXMOPBEIO
QOASDHOPEPNBUYUYOBXB
IONIAELOJHSWASMOUTRK
HPOIYTJPLNAQWDRIBITG
LPOINUYMRTEMPTMLMNBO
PAFCOPLHAVAIANALBPFS
MARGARITA
ALEMA
BARBECUE
TROPICAL
SUPREMA
LOUISIANA
CHEESEHAM
EUROPA
HAVAIANA
CAMPONESA

Sample Output

0 15 G
2 11 C
7 18 A
4 8 C
16 13 B
4 15 E
10 3 D
5 1 E
19 7 C
11 11 H
【分析】

  听说TRIE+爆搜能过,于是我就爆搜了。

代码如下:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 1010
#define Maxl 1010 char s[Maxl][Maxl];
char ss[Maxl][Maxl];
int dx[]={,,,,-,-,-,,},
dy[]={,,-,-,-,,,,};
int ans[Maxn][],dr[Maxn];
int n,m; struct node
{
int son[],cnt,fail;
int num,rt,p;
}t[Maxn*];int tot; void upd(int x)
{
t[x].cnt=;t[x].p=;
memset(t[x].son,,sizeof(t[x].son));
} void read_trie(int x)
{
scanf("%s",ss[x]+);
int len=strlen(ss[x]+);
int now=;
for(int j=;j<=len;j++) ss[][j]=ss[x][len-j+];
for(int j=;j<=len;j++)
{
int ind=ss[][j]-'A'+;
if(!t[now].son[ind])
t[now].son[ind]=++tot,upd(tot);
now=t[now].son[ind];
if(j==len) t[now].cnt++,t[now].p=x;
}
} void dfs(int x,int y,int dir,int now)
{
if(t[now].p!=)
{
int q=t[now].p;
ans[q][]=x;ans[q][]=y;dr[q]=dir;
t[now].p=;
}
if(x+dx[dir]<||x+dx[dir]>n||y+dy[dir]<||y+dy[dir]>m) return;
int a=t[now].son[s[x+dx[dir]][y+dy[dir]]-'A'+];
if(a!=)
dfs(x+dx[dir],y+dy[dir],dir,a);
} void init()
{
int q;
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=n;i++)
{
scanf("%s",s[i]+);
}
tot=;upd();
for(int i=;i<=q;i++)
{
read_trie(i);
}
for(int i=;i<=n+;i++)
for(int j=;j<=m+;j++)
{
for(int k=;k<=;k++)
{
dfs(i,j,k,);
}
}
for(int i=;i<=q;i++)
{
printf("%d %d %c\n",ans[i][]-,ans[i][]-,dr[i]+'A'-);
}
} int main()
{
init();
return ;
}

[POJ1204]

2016-06-19 14:09:06



后来还是打了一下AC自动机,嗯,感觉for那里还是超级慢,因为重叠那部分不好搞,就这样吧。

代码如下:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 1010
#define Maxl 1010 char s[Maxl][Maxl];
char ss[Maxl][Maxl];
int dx[]={,,,,-,-,-,,},
dy[]={,,-,-,-,,,,};
int ans[Maxn][],dr[Maxn];
int n,m,qy; struct node
{
int son[],cnt,fail;
int num,rt;
}t[Maxn*];int tot; int p[Maxn]; void upd(int x)
{
t[x].cnt=;/*t[x].p=0;*/
memset(t[x].son,,sizeof(t[x].son));
} void read_trie(int x)
{
scanf("%s",ss[x]+);
int len=strlen(ss[x]+);
int now=;
for(int j=;j<=len;j++) ss[][j]=ss[x][len-j+];
for(int j=;j<=len;j++)
{
int ind=ss[][j]-'A'+;
if(!t[now].son[ind])
t[now].son[ind]=++tot,upd(tot);
now=t[now].son[ind];
if(j==len) t[now].cnt++,p[x]=now;
}
} queue<int > q;
void build_AC()
{
int i,j,x,y;
while(!q.empty()) q.pop();
q.push();
while(!q.empty())
{
x=q.front();
y=t[x].fail;
for(j=;j<=;j++)
{
if(t[x].son[j])
{
q.push(t[x].son[j]);
t[t[x].son[j]].fail=x?t[y].son[j]:x;
}
else t[x].son[j]=t[y].son[j];
}
q.pop();
}
} void check(int x,int y,int dir,int now)
{
if(now==) return;
for(int i=;i<=qy;i++) if(p[i]==now)
{
ans[i][]=x;
ans[i][]=y;
dr[i]=dir;
}
now=t[now].fail;
check(x,y,dir,now);
} void dfs(int x,int y,int dir,int now)
{
now=t[now].son[s[x][y]-'A'+];
check(x,y,dir,now);
x=x+dx[dir],y=y+dy[dir];
if(x<||x>n||y<||y>m) return;
dfs(x,y,dir,now); } void init()
{
scanf("%d%d%d",&n,&m,&qy);
for(int i=;i<=n;i++)
{
scanf("%s",s[i]+);
}
tot=;upd();
for(int i=;i<=qy;i++)
{
read_trie(i);
}
build_AC();
for(int i=;i<=n;i++)
for(int k=;k<=;k++)
{
dfs(i,,k,);
dfs(i,m,k,);
}
for(int j=;j<=m;j++)
for(int k=;k<=;k++)
{
dfs(,j,k,);
dfs(n,j,k,);
}
for(int i=;i<=qy;i++)
{
printf("%d %d %c\n",ans[i][]-,ans[i][]-,dr[i]+'A'-);
}
} int main()
{
init();
return ;
}

[POJ1204-2]

2016-06-21 17:14:17

												

【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)的更多相关文章

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

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

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

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

  3. POJ 1204 Word Puzzles | AC 自动鸡

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

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

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

  5. poj 1204 Word Puzzles(字典树)

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

  6. [知识点]Trie树和AC自动机

    // 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...

  7. 从Trie谈到AC自动机

    ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字 ...

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

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

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

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

随机推荐

  1. android.util.Log说明和android 像素说明

    1. android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母对应VERBOSE,DEBUG,INFO, ...

  2. 【转】warning C4819,该文件保存为 Unicode 格式以防止数据丢失,处理方法

    以下的解决方案只是把错误给屏蔽掉而已,并不能真正解决这个警告.仅供参考! 当项目引用到外部源代码后,经常出现4819错误,警告信息如下: warning C4819: 该文件包含不能在当前代码页(93 ...

  3. Windows Server 2008 R2 域控制器部署指南

    一.域控制器安装步骤: 1.装 Windows Server 2008 R2并配置计算机名称和IP地址(见 附录一) 2.点击“开始”,在“搜索程序和文件”中输入Dcpromo.exe后按回车键: 3 ...

  4. JDK自带方法实现消息摘要运算

    啊,有点小注释,懒得介绍了,就贴个代码吧,大意理解就可以了. package jdbc.pro.lin; import java.security.InvalidKeyException; impor ...

  5. wps批量使标题靠文档左边

  6. php字符串函数(1)

    下面去学习一下php的字符串函数,那么怎么去看手册呢,举个例子 int strcasecmp ( string $str1 , string $str2 ) 第一个int,表示此函数返回的类型是int ...

  7. ManualResetEvent的使用与介绍

    它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 Manu ...

  8. 一封给“X教授”的回信(讨论Socket通信)

    转载:http://www.cnblogs.com/tianzhiliang/archive/2011/03/02/1969187.html 前几天"X教授"发Email与我讨论S ...

  9. WCF 无法生成 client

    在MVC中调用WCF 总是没有client 后来在网上查找原因,去掉Reuse type in referrenced assenbiles ,就可以生成代理代码.

  10. 【转】ASP.NET常用数据绑定控件优劣总结

    转自:http://www.cnblogs.com/Olive116/archive/2012/10/24/2736570.html ASP.NET常用数据绑定控件优劣总结   本文的初衷在于对Asp ...