POJ3630 trie字典樹水題

題意:給出一些電話號碼,詢問是否某個電話號碼是其他電話號碼的前綴,有輸出NO,沒有輸出YES。

顯然的字典樹。好久沒寫了,拿出來練練。
借用了xffyjq大神的新申請結構體指針防爆寫法。%%%%%

注意是不是前綴在主串之後輸入。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std ;
int n, m, tot ;

struct node {
    node* nxt[20] ;
    bool over ;
    void clear() {
        over = 0 ;
        for ( int i = 0 ; i < 20 ; i ++ ) 
            nxt[i] = NULL ;
    }
} *h, *p, *q, nnode[100010] ;

const int maxn = 20 ;
char s[maxn] ;
bool insert() {
    bool isnew = false, _include = false ;
    p = h ;
    for ( int i = 1 ; i <= m ; i ++ ) {
        if ( p->over ) _include = true ;
        if ( p->nxt[ s[i]-'0' ] ) p = p->nxt[ s[i]-'0' ] ;
        else {
            isnew = true ;
            p->nxt[ s[i]-'0' ] = nnode+(++tot) ;
            p = p->nxt[ s[i]-'0' ] ;
        }
    }
    p->over = true ;
    if ( !isnew || _include ) return true ;
    return false ;
}

int main() {
    int i, j, k, _ ;
    scanf ( "%d", &_ ) ;
    while ( _-- ) {
        h = nnode+(++tot) ;
        scanf ( "%d", &n ) ;
        bool flg = false ;
        for ( i = 1 ; i <= n ; i ++ ) {
            scanf ( "%s", s+1 ) ;
            m = strlen(s+1) ;
            if ( insert() )
                flg = 1 ;
        }
        if ( flg ) puts("NO") ;
        else puts("YES") ;
        while (tot)
            nnode[tot--].clear() ;
    }
    return 0 ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章