首页 > 代码库 > poj 1204 Word Puzzles 静态trie数解决多模式串匹配问题
poj 1204 Word Puzzles 静态trie数解决多模式串匹配问题
题意:
给一个二维字符数组和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; }
poj 1204 Word Puzzles 静态trie数解决多模式串匹配问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。