poj 1204
http://poj.org/problem?id=1204
大意:给出一个棋盘puzzle,,和w个模式串,,在棋盘中寻找模式串。。棋盘中任意一格有8个方向可以走。。
解题思路: AC自动机 + 枚举8个方向即可
get_trie(),get_ac().直接用模版。。。。
query 有一点小技巧。。需要枚举8个方向,,对于一行,我们对竖直方向上的枚举可以省略,因为我们在竖直方向上枚举时,会补充上。。
另外 我们无需枚举一行中的每一个点,,只需第一个即可,因为,,我们在一个方向上枚举时,,会包含到后面的。
#include <iostream>
#include<cstring>
using namespace std;
struct point{
point *fail;
point *next[];
bool istail;//是否为单词结尾
int id;//单词的输入顺序
point(){ //初始化
istail =false;
fail = NULL;
memset(next,NULL,sizeof(next));
}
}*q[];//bfs 获得fail 用 struct pos{
int x,y,dis;
};
pos ans[];
point *root = NULL;
int l,c,w;
char map[][];//puzzle
char str[];//模版串
int len[];//记录每个摸版的长度
int tail,head;
int dix[][] = {-,,-,,,,,,,,,-,,-,-,-};//顺时针,,上下左右。。。八个方向
char res[]={"ABCDEFGH"};
void build_trie(char *str,int id){
point *p = root;
int i=,index;
while(str[i]){
index = str[i]-'A';
if(p->next[index]==NULL) p->next[index] = new point();
p = p->next[index];
i++;
}
p->istail = true;
p->id = id;
}
void get_ac(){
int i;
root->fail = NULL;
q[head++] = root;
while(head!=tail){
point *temp = q[tail++];
point *p =NULL;
for(i=;i<;i++){
if(temp->next[i]!=NULL){
if(temp==root) temp->next[i]->fail=root;
else{
p = temp->fail;
while(p!=NULL){
if(p->next[i]!=NULL){
temp->next[i]->fail = p->next[i];
break;
}
p = p->fail;
}
if(p==NULL) temp->next[i]->fail = root;
}
q[head++] = temp->next[i];
}
}
}
} void query(int x,int y,int i){
int index;
point *p,*qq;
p = root;
for(;map[x][y];x+=dix[i][],y+=dix[i][]){
index = map[x][y]-'A';
while(p->next[index]==NULL&&p!=root) p = p->fail;
p = p->next[index];
if(p==NULL)
p = root;
qq= p;
while(qq!=root){
if(qq->istail){
qq->istail = false;
ans[qq->id].x = x-dix[i][]*(len[qq->id]-)-;//从1开始记得数
ans[qq->id].y = y-dix[i][]*(len[qq->id]-);
ans[qq->id].dis = i;
}
qq = qq->fail;
}
}
}
int main()
{
root = new point();
cin>>l>>c>>w;
for(int i=;i<=l;i++)
cin>>map[i];
for(int i=;i<w;i++){
cin>>str;
len[i] = strlen(str);
build_trie(str,i);
}
head = tail =;
get_ac();
for(int i=;i<=l;i++){//枚举水平
query(i,,),query(i,,),query(i,,);//一行只需枚举开头和结尾即可,一列同样
query(i,c-,),query(i,c-,),query(i,c-,);
}
for(int i=;i<c;i++){//枚举竖直
query(,i,),query(,i,),query(,i,);
query(l,i,),query(l,i,),query(l,i,);
} for(int i=;i<w;i++){
cout<<ans[i].x<<" "<<ans[i].y<<" "<<res[ans[i].dis]<<endl;
}
return ;
}
poj 1204的更多相关文章
- poj 1204 Word Puzzles(字典树)
题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...
- 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...
- [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题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)
本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...
- [转] POJ字符串分类
POJ 1002 - 487-3279(基础)http://acm.pku.edu.cn/JudgeOnline/problem?id=1002题意:略解法:二叉查找数,map,快排... POJ 1 ...
- ACM 字符串 题目整理
AC自动机 UVa 11468 Substring AC自动机+概率DP. 注意要补全不存在的边. 为什么要补全不存在的边呢?补全以后可以直接找到状态的转移,即从所有子节点就可以实现所有状态转移. ...
随机推荐
- Android 流媒体系列(二)
import java.io.IOException; import android.app.Activity; import android.content.ContentResolver; imp ...
- java的抽象类
现实世界中,人们表征世界时,会把现实世界中的很多类具有相同特征的事物归为一个抽象类.比如水果是许多植物果实的总称,我们可以定义一个苹果类.定义一个西瓜类,可以实例化一个苹果对象,可以实例化一个西瓜对象 ...
- iOS开发中,应用内直接跳转到Appstore
iOS开发中,应用内直接跳转到Appstore 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat: ...
- android错误之==与equals的区别
在做一个电话号码匹配的时候, 开始我使用的是这种情况 if (num == inCall.getNum()) { //操作... } 但是无论如何结果都是false,就算两个号码打印出来一模一样还是f ...
- C# DateTime.Now 用法小记
1.DateTime.Now 获取时间跟系统当前时间一直并且格式一直,如系统时间带有星期几,获取的时间也会带有 2,以下为拷贝前人总结的: //2008年4月24日 System.DateTime ...
- BZOJ 1257 余数之和sum(分块优化)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=46954 题意:f(n, k)=k mod 1 + k mod 2 ...
- BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )
先二分答案m,<=m的有m-∑(m/pi*pi)+∑(m/pi*pi*pj*pj)-……个符合题意的(容斥原理), 容斥系数就是莫比乌斯函数μ(预处理)... ----------------- ...
- html5 geolocation API
清单 1. 检查浏览器支持性if (navigator.geolocation) 清单 2. 单次定位请求 API void getCurrentPosition(updateLocation, op ...
- php多图合并
function mergerImg($imgs) { list($max_width, $max_height) = getimagesize($imgs['dst']); $dests = ima ...
- MVC-03 控制器(5)
八.动作过滤器 有时在运行Action之前或之后会需要运行一些逻辑运算,以及处理一些运行过程中所生成的异常状况,为了满足这个需求,ASP.NET MVC提供动作过滤器(Action Filter)来处 ...