您的位置:首页 > 其它

poj 1204 Word Puzzles 字典树

2011-04-20 16:38 267 查看
Word Puzzle

字典树实现

AC自动机实现

/*
* File:   main.cpp
* Author: Mi
*
* Created on 2011年4月20日, 下午4:10
*/
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define KIND 26
#define MAX 10005
using namespace std;
/*
*
*/
char msg[MAX][MAX];
int d[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}},n,m;
int ans[MAX][3],len[MAX];
bool ok(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
struct node
{
node *fail;
node *next[KIND];
int num;
node()
{
fail=NULL;
memset(next,NULL,sizeof(next));
num=-1;
}
}*root;
void Insert(node *root,char *str,int num)
{
node *p=root;
for(int i=0;str[i];i++)
{
int Index=str[i]-'A';
if(p->next[Index]==NULL)
p->next[Index]=new node();
p=p->next[Index];
}
p->num=num;
}
void Search(node *root,int x,int y,int k)
{
node *p=root;
int xx=x,yy=y;
while(ok(xx,yy))
{
int Index=msg[xx][yy]-'A';
if(p->next[Index]==NULL)
break;
else
p=p->next[Index];
if(p->num!=-1)
{
ans[p->num][0]=xx-len[p->num]*d[k][0];
ans[p->num][1]=yy-len[p->num]*d[k][1];
ans[p->num][2]=k+'A';
}
xx+=d[k][0];
yy+=d[k][1];
}
}
void solve()
{
int w;
root=new node();
scanf("%d%d%d",&n,&m,&w);
for(int i=0;i<n;i++)
scanf("%s",msg[i]);
for(int i=0;i<w;i++)
{
char str[MAX];
scanf("%s",str);
Insert(root,str,i);
len[i]=strlen(str)-1;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
//   if(i==0||j==0||i==n-1||j==m-1)
for(int k=0;k<8;k++)
Search(root,i,j,k);
for(int i=0;i<w;i++)
printf("%d %d %c/n",ans[i][0],ans[i][1],ans[i][2]);
}
int main(int argc, char** argv)
{
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: