题意:首先给出一个巨大的谜阵,然后给出一系列单词,问这个单词再谜阵中第几个位置以哪个方向(一共八个方向)查出来的,最后输出答案即可。
题解:先把这些单词都插入到字典树中,然后把谜阵按照八个方向暴搜即可。
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxnode=1e6+50;
const int sigma_size=26;
const int maxn=1e3+50;
char mapp[maxn][maxn],word[maxn][maxn];
int ans[maxn][3];
int t,l,c,w;
int visited[maxn];
int dir[][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
struct Trie{
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void clear(){
sz=1;
memset(ch[0],0,sizeof(ch[0]));
memset(val,0,sizeof(val));
}
int idx(char c){
return c-'A';
}
void insert(char *s,int v){
int u=0,n=strlen(s);
for(int i=0;i<n;i++){
int c=idx(s[i]);
if(!ch[u][c]){
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
void find_prefixes(int x,int y,int d){
int u=0;
int xx=x,yy=y;
while(xx>=0&&xx<l&&yy>=0&&yy<c){
int c=idx(mapp[xx][yy]);
if(!ch[u][c]){
break;
}else{
u=ch[u][c];
}
if(val[u]){
if(!visited[val[u]]){
ans[val[u]][0]=x;
ans[val[u]][1]=y;
ans[val[u]][2]=d;
}
visited[val[u]]=1;
}
xx+=dir[d][0];
yy+=dir[d][1];
}
}
};
Trie trie;
int main()
{
scanf("%d",&t);
while(t--){
memset(visited,0,sizeof(visited));
scanf("%d%d%d",&l,&c,&w);
for(int i=0;i<l;i++){
scanf("%s",mapp[i]);
}
trie.clear();
for(int i=1;i<=w;i++){
scanf("%s",word[i]);
trie.insert(word[i],i);
}
for(int i=0;i<l;i++){
for(int j=0;j<c;j++){
for(int k=0;k<8;k++){
trie.find_prefixes(i,j,k);
}
}
}
for(int i=1;i<=w;i++){
printf("%d %d %c\n",ans[i][0],ans[i][1],ans[i][2]+'A');
}
}
return 0;
}