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树 WA 望指教

Posted by bigeyex at 2010-05-08 17:42:28 on Problem 3080
单纯的WA,测试过题目中的数据,测试过题目中的数据,考虑了最后一句“按字母排序问题”。

#include<iostream>
#include<string.h>
using namespace std;

typedef struct _node{
    int next[4];
    int count; 
}NODE;

NODE nodes[10000];
int top;
char max_s[70];
int max_l;

void init_node(int i){
    int j;
    for(j=0;j<4;j++)
        nodes[i].next[j]=-1;
    nodes[i].count=0;
}

int G(char c){
    switch(c){
        case 'A':return 0;
        case 'T':return 1;
        case 'G':return 2;
        case 'C':return 3;
    }
    return -1;
}

void build_tree(char* s){
    int i,j,p;
    init_node(0);
    top=1;
    for(i=0;i<64;i++){
        j=0;
        p=0;
        while(s[i+j] != '\0'){
            if(nodes[p].next[G(s[i+j])] != -1){
                p=nodes[p].next[G(s[i+j])];
            }
            else{
                init_node(top);
                nodes[p].next[G(s[i+j])]=top;
                p=top;
                top++;
            }
            j++;
        }
    }
}

void search_tree(char* s,int count){
    int i,j,p,l;
    char cur[70];
    max_l=2;   //最长字符串长度
    max_s[0]='\0';
    for(i=0;i<64;i++){
        j=0;    
        p=0;    //树指针
        l=0;    //当前匹配串长度
        while(s[i+j] != '\0'){
            if(nodes[p].next[G(s[i+j])] != -1 && nodes[nodes[p].next[G(s[i+j])]].count >= count-1){
                p=nodes[p].next[G(s[i+j])];
                nodes[p].count=count;   //用count来控制“只走前人走过的路”
                cur[l]=s[i+j];
                l++;
            }
            else{
                cur[l]='\0';
                if(l>max_l || l==max_l && strcmp(max_s,cur)>0){
                    strcpy(max_s,cur);
                    max_l=l;
                }
                break;
            }
            j++;
        }
    }
}

int main(){
    int case_count,m;
    char str[70];
    int i,j;
    cin >> case_count;
    for(i=1;i<=case_count;i++){
        cin >> m;
        cin >> str;
        build_tree(str);
        for(j=1;j<=m-1;j++){
            cin >> str;
            search_tree(str,j);
            if(max_l <= 2)break;
        }
        if(max_l <= 2){
            cout << "no significant commonalities" << endl;
        }
        else{
            cout << max_s << endl;
        }

    }
    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