[정적 타이어 트 리] poj 3630: Phone List

대체로 제목:
    n 개의 길이 가 다른 문자열 을 보 여 줍 니 다. 만약 에 한 문자열 이 다른 문자열 의 접두사 라면 'NO' 를 출력 합 니 다. 그렇지 않 으 면 'YES' 를 출력 합 니 다.
 
대체적인 사고방식:
    사실은 아주 간단 한 tire 판단 으로 곧 썼 지만 TLE 입 니 다.손 이 싸 서 토론 을 뒤 져 보 니 동적 tire 나 무 는 매번 new 대상 이 시간 이 너무 걸 리 고 정적 배열 로 바 꿔 야 한 다 는 것 을 알 게 되 었 다.그래서 고 쳤 어 요. AC ~ ~
 
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include <algorithm>
using namespace std;
const int inf=1<<28;
const int mMax=10005;
const int nMax=50;
class nodea{
public:
    int id;
    bool vis;  //      
    nodea *p[10];
//    nodea(){
//        vis=0;
//        int i;
//        id=-1;
//        for(i=0;i<10;i++)p[i]=NULL;
//    }
};
nodea num[500000];nodea *root;
int x;
nodea * newnodea(){
    nodea * p = num + x++;
    for(int i = 0; i < 10; i++){
        p->p[i] = NULL;
    }
    p->id=-1;
    p->vis=0;
    return p;
}

int cnt;
bool flag;

int getnum(char *s){
    int i;
    nodea *r=root;
    int l=strlen(s);
    for(i=0;i<l;i++){
        r->vis=1;
        if(r->id!=-1)flag=0;
        if(r->p[s[i]-'0']==NULL){
            r->p[s[i]-'0']=newnodea();
        }
        r=r->p[s[i]-'0'];
    }
    if(r->id==-1){
        r->id=cnt;
        cnt++;
        if(r->vis==1){
            flag=0;
        }
        r->vis=1;
    }
    return r->id;
}

int main(){
    int n,i,t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        cnt=1;
        x=0;
        char str[nMax];
        root=newnodea();
        flag=1;
        for(i=0;i<n;i++){
            scanf("%s",str);
            if(flag)getnum(str);
        }
        if(flag){
            printf("YES
"); } else{ printf("NO
"); } } return 0; }

좋은 웹페이지 즐겨찾기