POJ3630 trie字典树水题

版权声明:hhhhh https://blog.csdn.net/WT_cnyali/article/details/69568922

题意:给出一些电话号码,询问是否某个电话号码是其他电话号码的前缀,有输出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 ;
}
阅读更多

没有更多推荐了,返回首页