题意:
从一个字母表里面找出目标字符串。
思路:
很裸的字典树。
#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; }