Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

第一道Trie题

Posted by yc5_yc at 2012-07-23 16:41:21 on Problem 1204
裸的Trie+裸的扫描
将要查找的东西扔到Trie里,然后对矩阵进行各种扫描,代码破了我的记录(除了打表),贴出纪念:
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int NMax=1010,CMax=26,PMax=NMax*NMax;
struct node 
{
    int num;
    node *child[26];
}pool[PMax],*Trie;
int M,N,Q,L;
char A[NMax][NMax],buf[NMax];
pair<pair<int,int>,char> ans[NMax];
int main()
{
    Trie=&pool[L++];
    scanf("%d%d%d",&M,&N,&Q);
    for(int i=0;i<M;i++)
        scanf("%s",A+i);
    for(int I=1;I<=Q;I++)
    {
        scanf("%s",buf);
        int len=strlen(buf);
        node *p=Trie;
        for(int i=0;i<len;i++)
        {
            if(p->child[buf[i]-'A']==NULL) p->child[buf[i]-'A']=&pool[L++];
            p=p->child[buf[i]-'A'];
        }
        p->num=I;
    }
    //C
    for(int i=0;i<M;i++)
    {
        for(int j=0;j<N;j++)
        {
            int r=j;
            while(r<N)
            {
                bool flag=1;
                node *p=Trie;
                for(int k=j;k<=r;k++)
                {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[i][k]-'A'];
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(i,j),'C');
                else break;
                r++;
            }
        }
    }
    //G
    for(int i=0;i<M;i++)
    {
        for(int j=N-1;j>=0;j--)
        {
            int r=j;
            while(r>=0)
            {
                bool flag=1;
                node *p=Trie;
                for(int k=j;k>=r;k--)
                {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[i][k]-'A'];
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(i,j),'G');
                else break;
                r--;
            }
        }
    }
    //puts("H1");
    //E
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            int r=j;
            while(r<M)
            {
                bool flag=1;
                node *p=Trie;
                for(int k=j;k<=r;k++)
                {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[k][i]-'A'];
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(j,i),'E');
                else break;
                r++;
            }
        }
    }
    //puts("H2");
    //A
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<M;j++)
        {
            int r=j;
            while(r>=0)
            {
                bool flag=1;
                node *p=Trie;
                for(int k=j;k>=r;k--)
                {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[k][i]-'A'];
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(j,i),'A');
                else break;
                r--;
            }
        }
    }
    //puts("H3");
    //D
    for(int i=0;i<M;i++) {
        for(int j=0;j<N;j++) {
            int x=i,y=j;
            while(x<M && y<N) {
                bool flag=1;
                int x1=i,y1=j;
                node *p=Trie;
                while(x1<=x && y1<=y) {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[x1][y1]-'A'];
                    x1++,y1++;
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(i,j),'D');
                else break;
                x++,y++;
            }
        }
    }
    //puts("H4");
    //H
    for(int i=0;i<M;i++) {
        for(int j=0;j<N;j++) {
            int x=i,y=j;
            while(x>=0 && y>=0) {
                bool flag=1;
                int x1=i,y1=j;
                node *p=Trie;
                while(x1>=x && y1>=y) {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[x1][y1]-'A'];
                    x1--,y1--;
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(i,j),'H');
                else break;
                x--,y--;
            }
        }
    }
    //puts("H5");
    //F
    for(int i=0;i<M;i++) {
        for(int j=0;j<N;j++) {
            int x=i,y=j;
            while(x<M && y>=0) {
                bool flag=1;
                int x1=i,y1=j;
                node *p=Trie;
                while(x1<=x && y1>=y) {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[x1][y1]-'A'];
                    x1++,y1--;
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(i,j),'F');
                else break;
                x++,y--;
            }
        }
    }
    //puts("H6");
    //B
    for(int i=0;i<M;i++) {
        for(int j=0;j<N;j++) {
            int x=i,y=j;
            while(x>=0 && y<N) {
                bool flag=1;
                int x1=i,y1=j;
                node *p=Trie;
                while(x1>=x && y1<=y) {
                    if(p==NULL) {
                        flag=0;
                        break;
                    }
                    p=p->child[A[x1][y1]-'A'];
                    x1--,y1++;
                }
                if(p==NULL) flag=0;
                if(flag)
                    ans[p->num]=make_pair(make_pair(i,j),'B');
                else break;
                x--,y++;
            }
        }
    }
    //puts("H7");
    for(int i=1;i<=Q;i++)
        printf("%d %d %c\n",ans[i].first.first,ans[i].first.second,ans[i].second);
    getchar();getchar();
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator