poj - 3630 - 전화 목록 (배열 Trip)

1692 단어
제목: n 개의 전화번호 (숫자 0 - 9 로 만 구성) 를 제시 하고 하나의 번호 가 다른 번호 의 접두사 가 있 는 지 물 어보 기 (1 ≤ 테스트 팀 수 t ≤ 40, 1 ≤ n ≤ 10000).
제목 링크:http://poj.org/problem?id=3630
- > > 이 문 제 를 푸 는 것 은 너무 어이 가 없어...분명히 Trip 한 그루 인 데 경기 가 끝 날 때 까지 TLE 인 데 그 이 유 를 따 져 보면 너무 뭐야...포인터 Trip...
이 문 제 는 정적 배열 을 사용 하여 Trip 을 씁 니 다...
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int maxw = 10 + 5;
const int maxc = 100000 + 10;
char p[maxw];
bool ok, isp[maxc];
int ch[maxc][10];

struct Trip{
    int sz;

    Trip(){
        sz = 1;
        memset(isp, 0, sizeof(isp));
        memset(ch, 0, sizeof(ch));
    }

    int idx(char c){
        return c - '0';
    }

    void insert(char *s){
        int len = strlen(s), i;
        int u = 0;
        for(i = 0; i < len; i++){
            int c = idx(s[i]);
            if(!ch[u][c]) ch[u][c] = sz++;
            else{
                if(i == len-1){
                    ok = 0;      //            
                    break;
                }
                if(isp[ch[u][c]]){
                    ok = 0;     //            
                    break;
                }
            }
            u = ch[u][c];
        }
        isp[u] = 1;
    }

    void solve(){
        if(ok) puts("YES");
        else puts("NO");
    }
};

int main()
{
    int t, n;
    scanf("%d", &t);
    while(t--){
        ok = 1;
        scanf("%d", &n);
        Trip trip;
        for(int i = 0; i < n; i++){
            scanf("%s", p);
            if(ok) trip.insert(p);
        }
        trip.solve();
    }
    return 0;
}

좋은 웹페이지 즐겨찾기