程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1204

POJ 1204

編輯:C++入門知識

trie樹做法


[cpp] 
#include<cstdio> 
#include<cstring> 
#include<queue> 
#include<cstdlib> 
const int kind=26; 
using namespace std; 
char s[1010][1010]; 
int h[]={-1,-1,0,1,1,1,0,-1}; 
int g[]={0,1,1,1,0,-1,-1,-1}; 
int m,n,q,sum; 
int xx[1010],yy[1010],zz[1010]; 
 
struct trie{ 
    struct trie * fail,*next[kind]; 
    int count,num; 
}; 
struct trie * root; 
void insert(char* str,int ii){ 
    int len=strlen(str),i,tem; 
    struct trie *p,*q; 
    p=root; 
    for(i=0;i<len;i++){ 
        tem=str[i]-'A'; 
        if(p->next[tem]==NULL){ 
            q=(struct trie*)calloc(1,sizeof(struct trie)); 
            q->count=0; 
            q->num=0; 
            q->fail=NULL; 
            memset(q->next,NULL,sizeof(q->next)); 
            p->next[tem]=q; 
        } 
        p=p->next[tem]; 
    } 
    p->count=1; 
    p->num=ii; 

bool yes(int i,int j){ 
    if(i>=0 && j>=0 && i<n && j<m) 
        return 1; 
    return 0; 

void query(int i,int j,int k){ 
    int tem,x,y,pp; 
    struct trie* tmp=root,*p; 
    x=i,y=j; 
    for(pp=0;yes(i+pp*h[k],j+pp*g[k]);pp++){ 
        x=i+pp*h[k]; 
        y=j+pp*g[k]; 
        tem=s[x][y]-'A'; 
        if(tmp->next[tem]==NULL) 
            return; 
        tmp=tmp->next[tem]; 
        if(tmp->count){ 
            sum++; 
            xx[tmp->num]=i; 
            yy[tmp->num]=j; 
            zz[tmp->num]=k; 
            tmp->count=0; 
        } 
    } 

void sea(){ 
    char str[2010]; 
    int i,j,k; 
    sum=0; 
    for(i=0;i<n;i++) 
        for(j=0;j<m;j++){ 
            for(k=0;k<8;k++){ 
                query(i,j,k); 
                if(sum==q)return; 
            } 
        } 

int main(){ 
    int i; 
    char str[2010]; 
    root=(struct trie*)calloc(1,sizeof(struct trie)); 
    root->fail=NULL; 
    root->count=0; 
    root->num=0; 
    memset(root->next,NULL,sizeof(root->next)); 
 
    scanf("%d %d %d",&n,&m,&q); 
    for(i=0;i<n;i++) 
        scanf("%s",s[i]); 
 
    for(i=1;i<=q;i++){ 
        scanf("%s",str); 
        insert(str,i); 
    } 
    sea(); 
    for(i=1;i<=q;i++){ 
        printf("%d %d %c\n",xx[i],yy[i],'A'+zz[i]); 
    } 


AC自動機做法


作者:waitfor_

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved