poj 1204 Word Puzzles

AC自动机+搜索,直接trie也能过
#include <stdio.h>
#include 
<string.h>

char str[1010][1010], temstr[1010];
int r, c, n, point;
int queue[501000];
int div[8][2]={{-10}, {-11}, {01}, {11}, {10}, {1-1}, {0-1}, {-1-1}};

struct P
{
    
int child[27];
    
int len, fail, id, num;
}node[
501000];

struct ANS
{
    
int x, y;
    
char c;
}ans[
1010];

void insert(int id)
{
    
int p = 0, len= strlen(temstr), t;
    
for ( int i = 0 ; temstr[i] ; i++ )
    {
        t
= temstr[i]-'A';
        
if ( !node[p].child[t] )
            node[p].child[t]
= point++;
        p
= node[p].child[t];
    }
    node[p].num
++;
    node[p].id
=id;
    node[p].len
=len;
}

void init()
{
    memset(node, 
0sizeof(node));
    point
= 1;
}

void buildAC()
{
    
int rear=-1, front=0, i, k;
    queue[
0]= 0;
    node[
0].fail= -1;
    
while ( rear < front )
    {
        
int now= queue[++rear];
        
for ( i = 0 ; i < 26 ; i++ )
        {
            
int t= node[now].child[i];
            
if ( !t ) continue;
            
for ( k = node[now].fail ; k != -1 ; k= node[k].fail )
                
if (node[k].child[i])
                {
                    node[t].fail
=node[k].child[i];
                    
break;
                }
            
if ( k == -1 )
                node[t].fail
=0;
            queue[
++front]= t;
        }
    }
}

void find(int x, int y, int k)
{
    
int i = x, j= y, p= 0;
    
while (  0 <= i && i < r && 0 <= j && j < c )
    {
        
int ch= str[i][j]-'A';
        
if (node[p].child[ch])
        {
            p
= node[p].child[ch];
            
if ( node[p].num>0 )
            {
                
int id= node[p].id;
                ans[id].x
= i-(node[p].len-1)*div[k][0];
                ans[id].y
= j-(node[p].len-1)*div[k][1];
                ans[id].c
= k+'A';
                node[p].num
= 0;
            }
            i
+=div[k][0];
            j
+=div[k][1];
        }
        
else if(p)
        {
            p
= node[p].fail;
            
if (node[p].num>0)
            {
                
int id= node[p].id;
                ans[id].x
= i-(node[p].len-1)*div[k][0];
                ans[id].y
= j-(node[p].len-1)*div[k][1];
                ans[id].c
= k+'A';
                node[p].num
= 0;
            }
        }
        
else
        {
            i
+=div[k][0];
            j
+=div[k][1];
        }
    }
}

void get()
{
    
int i;
    
for ( i = 0 ; i < c ; i++ )
    {
        find(r
-1, i, 7);
        find(r
-1, i, 0);
        find(r
-1, i, 1);
        find(
0, i, 3);
        find(
0, i, 4);
        find(
0, i, 5);
    }
    
for ( i = 0 ; i < r ; i++ )
    {
        find(i, 
01);
        find(i, 
02);
        find(i, 
03);
        find(i, c
-15);
        find(i, c
-16);
        find(i, c
-17);
    }
}

int main()
{
    scanf(
"%d%d%d"&r, &c, &n);
    
int i;
    init();
    
for ( i = 0 ; i < r ; i++ )
        scanf(
"%s", str[i]);
    
for ( i = 0 ; i < n ; i++ )
    {
        scanf(
"%s", temstr);
        insert(i
+1);
    }
    buildAC();
    
get();
    
for ( int i = 0 ; i < n ; i++ )
        printf(
"%d %d %c\n", ans[i+1].x, ans[i+1].y, ans[i+1].c);
    
return 0;
}

posted on 2011-09-11 23:35 purplest 阅读(340) 评论(0)  编辑 收藏 引用 所属分类: String Algorithm


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论