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