【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
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
CAMPONESASample 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自动机)的更多相关文章
- [POJ 1204]Word Puzzles(Trie树暴搜&AC自己主动机)
Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...
- [poj] 1204 Word Puzzles || AC自动机
原题 给个X*Y的字符串矩阵,W个询问,对每个询问输出这个串出现的位置及方向,共有8个方向,顺时针开始分别用A~H表示 AC自动机的板子题. 对于待匹配串建一个自动机,然后从矩阵的四周分别沿八个方向跑 ...
- POJ 1204 Word Puzzles | AC 自动鸡
题目: 给一个字母矩阵和几个模式串,矩阵中的字符串可以有8个方向 输出每个模式串开头在矩阵中出现的坐标和这个串的方向 题解: 我们可以把模式串搞成AC自动机,然后枚举矩阵最外围一层的每个字母,向八个方 ...
- POJ 1204 Word Puzzles(AC自动机)
这题的数据卡在,如下: 5 5 3 ABCDE FGHIJ KLMNO PQRST UVWXY PQR RS RST puzzle中间的行中可以包含要查询的多个单词.这个问题很好解决,SearchDf ...
- poj 1204 Word Puzzles(字典树)
题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...
- [知识点]Trie树和AC自动机
// 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...
- 从Trie谈到AC自动机
ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字 ...
- POJ 题目1204 Word Puzzles(AC自己主动机,多个方向查询)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10244 Accepted: 3864 S ...
- PKU 1204 Word Puzzles(AC自动机)
题目大意:原题链接 给定一个字符串矩阵和待查找的单词,可以朝8个不同的方向查找,输出待查找单词第一个字母在矩阵中出现的位置和该单词被查到的方向. A~H代表8个不同的方向,A代表正北方向,其他依次以4 ...
随机推荐
- 使用tuple返回多个值
17.4编写并测试findbook函数 #include<iostream> #include<vector> #include<string> #include& ...
- LabVIEW设计模式系列——case结构模拟事件结构
标准:1.所有按钮的机械动作必须都用释放时触发或者单击时触发,这是为了保证仅仅触发一次动作. 标准:1.使用简单的case结构模拟事件结构.
- mysql导出部分数据的几种方法(摘录)
mysql虽然可以使用mysqldump来进行数据的到处,可是在很多场合的需求都不一样,比如我只要导出某个字段呢?只要导出某些我需要的数据呢? 这个时候mysqldump可能就不大好使了 方法一. i ...
- Java基础知识强化之IO流笔记25:FileInputStream / FileOutputStream 复制图片案例
1. 需求:把D:\\美女.jpg 复制到当前项目目录下mn.jpg 代码示例: package com.himi.filecopy; import java.io.FileInputStream; ...
- linux 下ffmpeg和mencoder安装
ffmpeg和mencoder是进行视频转换和视频抽帧的重要开源工具,支持linux和windows环境下的视频转换和视频抽帧操作.本文章记录在linux这两者工具的安装过程.ffmpeg集成视频编码 ...
- LCA问题
基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的 ...
- Angular2 - Starter - Component and Component Lifecircle Hooks
我们通过一个NgModule来启动一个ng app,NgModule通过bootstrap配置来指定应用的入口组件. @NgModule({ bootstrap: [ AppComponent ], ...
- python sklearn.linear_model.LinearRegression.score
score(self, X, y, sample_weight=None) 作用:返回该次预测的系数R2 其中R2 =(1-u/v).u=((y_true - y_pred) ** 2).su ...
- <div>相关
定义 <div>是一个块级元素[会自动换行] 用法 <div>可用于划分独立的一个块状区域,其内部内容显示在<div>的content部分内 结构 [盗用张图] 从 ...
- 雷鸟(Thunderbird)收取Gmail出错,收到警告邮件
如题,每次打开thunderbird都会收到以下提醒邮件,后来发现,只要将thunderbird中和google服务有关的插件卸载掉就可以了 We prevented the sign-in atte ...
