• poj 1204 Word Puzzles 夜


    http://poj.org/problem?id=1204

    AC自动机

    代码:

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<set>
    #include<map>
    #include<algorithm>
    
    #define LL long long
    
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    const int N=1005;
    const int M=1000005;
    const int K=26;
    struct nodeTrie
    {
        int v;
        int level;
        int fail;
        int next[K];
        void initialize()
        {
            v=0;
            level=0;
            fail=-1;
            memset(next,-1,sizeof(next));
        }
    }trie[M];
    int cnt,root;
    char graph[N][N];
    int X[]={-1,-1,0,1,1,1,0,-1};
    int Y[]={0,1,1,1,0,-1,-1,-1};
    char s[N];
    int outx[N],outy[N],outd[N],dx[N],dy[N];
    int getNewNode()
    {
        ++cnt;
        trie[cnt].initialize();
        return cnt;
    }
    void addWord(int p,char *s,int k)
    {
        if(s[0]=='\0') return ;
        for(int i=0;s[i]!='\0';++i)
        {
            if(trie[p].next[s[i]-'A']==-1)
            trie[p].next[s[i]-'A']=getNewNode();
            p=trie[p].next[s[i]-'A'];
            trie[p].level=i;
            //cout<<s[i]<<" "<<trie[p].level<<endl;
        }
        (trie[p].v)=k;
    }
    void init(int n,int m,int w)
    {
        cnt=-1;
        root=getNewNode();
        for(int i=0;i<n;++i)
        gets(graph[i]);
        for(int i=1;i<=w;++i)
        {
            gets(s);
            addWord(root,s,i);
        }
    }
    void bfs(int p)
    {
        trie[p].fail=root;
        queue<int>qt;
        qt.push(p);
        while(!qt.empty())
        {
            int y;
            int x=qt.front();qt.pop();
            for(int i=0;i<K;++i)
            if(trie[x].next[i]!=-1)
            {
                qt.push(trie[x].next[i]);
                if(x==root)
                {trie[trie[x].next[i]].fail=root;continue;}
                y=trie[x].fail;
                while(y!=root&&trie[y].next[i]==-1)
                y=trie[y].fail;
                if(trie[y].next[i]!=-1)
                trie[trie[x].next[i]].fail=trie[y].next[i];
                else
                trie[trie[x].next[i]].fail=root;
            }
        }
    }
    void match(int p,char *s,int d)
    {
        int l=0;
        while(s[l]!='\0')
        {
            while(trie[p].next[s[l]-'A']==-1&&p!=root)
            p=trie[p].fail;
            if(trie[p].next[s[l]-'A']!=-1)
            p=trie[p].next[s[l]-'A'];
            int fp=p;
            while(fp!=root)
            {
                if(trie[fp].v==-1)
                break;
                if(trie[fp].v>0)
                {
                    outx[trie[fp].v]=dx[l-trie[fp].level];
                    outy[trie[fp].v]=dy[l-trie[fp].level];
                    outd[trie[fp].v]=d;
                }
                trie[fp].v=-1;
                fp=trie[fp].fail;
            }
            ++l;
        }
    }
    void getSentence(int n,int m,int x1,int y1,int k)
    {
        int len=0;
        for(int x=x1,y=y1;x>=0&&x<n&&y>=0&&y<m;x+=X[k],y+=Y[k])
        {
            s[len]=graph[x][y];
            dx[len]=x;
            dy[len]=y;
            ++len;
        }
        s[len]='\0';
        match(root,s,k);
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int n,m,w;
        while(scanf("%d %d %d ",&n,&m,&w)!=EOF)
        {
            init(n,m,w);
            bfs(root);
            for(int i=0;i<n;++i)
            {
                getSentence(n,m,i,0,1);
                getSentence(n,m,i,0,2);
                getSentence(n,m,i,0,3);
                getSentence(n,m,i,m-1,5);
                getSentence(n,m,i,m-1,6);
                getSentence(n,m,i,m-1,7);
            }
            for(int j=0;j<m;++j)
            {
                getSentence(n,m,0,j,3);
                getSentence(n,m,0,j,4);
                getSentence(n,m,0,j,5);
                getSentence(n,m,n-1,j,0);
                getSentence(n,m,n-1,j,1);
                getSentence(n,m,n-1,j,7);
            }
            for(int i=1;i<=w;++i)
            printf("%d %d %c\n",outx[i],outy[i],outd[i]+'A');
        }
        return 0;
    }
    

      

  • 相关阅读:
    面向对象编程总结Python
    垃圾收集器与内存分配策略
    自定义异常、异常处理注意点
    关于线程【一】——线程创建、停止、interrupted()和isInterrupted()区别
    Java内存区域
    HotSpot虚拟机对象
    异常——try、catch、finally、throw、throws
    关于线程【二】——线程同步和异步
    fillder代理调试
    新鲜出炉的Asp.Net MVC电子书
  • 原文地址:https://www.cnblogs.com/liulangye/p/2976638.html
Copyright © 2020-2023  润新知