题意:
从一个字母表里面找出目标字符串。
思路:
很裸的字典树。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Abs(a) ((a)>0?(a):(-(a)))
#define llong long long int
using namespace std;
const int N=1005;
const int inf=(1<<30);
int n,m,w;
char a[N][N];
char word[N][N];
bool vis[N];
int ans[N][3];
int mx[8]={0,1,1,1,0,-1,-1,-1};
int my[8]={-1,-1,0,1,1,1,0,-1};
struct Trie
{
int end;
Trie * next[26];
Trie()
{
end=-1;
memset(next,0,sizeof(next));
}
};
Trie * root =new Trie;
void Trie_insert(Trie * t,char * s,int index)
{
if(*s!='\0')
{
if(t->next[*s-'A']==0)
{
t->next[*s-'A']=new Trie;
}
Trie_insert(t->next[*s-'A'],s+1,index);
}
else
{
t->end=index;
}
}
void Trie_search(Trie * t,int ox,int oy,int x,int y,int k)
{
if(!t)
{
return;
}
if(t->end!=-1&&!vis[t->end])
{
vis[t->end]=true;
ans[t->end][0]=oy;
ans[t->end][1]=ox;
ans[t->end][2]=k;
}
if(y<0||x<0||y>=n||x>=m)
return;
Trie_search(t->next[a[y][x]-'A'],ox,oy,x+mx[k],y+my[k],k);
}
/*void Trie_print(Trie * t)
{
if(t->end!=-1)
{
printf(" %d\n",t->end);
return;
}
for(int i=0;i<26;i++)
{
if(t->next[i]!=NULL)
{
printf("%c",i+'A');
Trie_print(t->next[i]);
}
}
}*/
void solve()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
for(int k=0;k<8;k++)
{
Trie_search(root,j,i,j,i,k);
}
}
for(int i=1;i<=w;i++)
printf("%d %d %c\n",ans[i][0],ans[i][1],ans[i][2]+'A');
}
int main()
{
scanf("%d%d%d",&n,&m,&w);
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
}
for(int i=1;i<=w;i++)
{
scanf("%s",word[i]);
Trie_insert(root,word[i],i);
}
solve();
return 0;
}