当前位置: 代码迷 >> 综合 >> poj 1204 Word Puzzles 静态trie树解决多模式串匹配问题
  详细解决方案

poj 1204 Word Puzzles 静态trie树解决多模式串匹配问题

热度:27   发布时间:2024-01-19 06:03:00.0

题意:

给一个二维字符数组和w个模式串,求这w个模式串在二维字符数组的位置。

分析:

静态trie树。

代码:

//poj 1204
//sep9
#include <iostream>
using namespace std;
const int maxN=1024;
const int maxM=270*maxN;
char str[maxN][maxN];
char s[maxN];
int vis[27],query_id[maxM],ans[maxN][3];
int num,x,y,q,n,m;
int d[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
int f;
struct Trie
{int next[27];	
}trie[maxM];void insert(int k)
{int u=0,i=0,l=strlen(s);	for(i=0;i<l;++i){int c=s[i]-'A';if(!trie[u].next[c]) trie[u].next[c]=++num;u=trie[u].next[c];		}query_id[u]=k;
}void search(int u,int i,int j)
{if(!u) return ;	if(query_id[u]){ans[query_id[u]][0]=x;ans[query_id[u]][1]=y;ans[query_id[u]][2]=q;query_id[u]=0;}int nx=i+d[q][0];int ny=j+d[q][1];if(nx<0||nx>=n||ny<0||ny>=m)return ;int l=str[nx][ny]-'A';search(trie[u].next[l],nx,ny);
}
int main()
{int p,i,j,k;scanf("%d%d%d",&n,&m,&p);memset(vis,0,sizeof(vis));num=0;for(i=0;i<n;++i)scanf("%s",str[i]);for(i=1;i<=p;++i){scanf("%s",s);insert(i);vis[s[0]-'A']=1;}for(i=0;i<n;++i)for(j=0;j<m;++j)if(vis[str[i][j]-'A']){x=i,y=j;for(k=0;k<8;++k){q=k;search(trie[0].next[str[i][j]-'A'],i,j);}}for(i=1;i<=p;++i)printf("%d %d %c\n",ans[i][0],ans[i][1],ans[i][2]+'A');return 0;	
} 


  相关解决方案