題意:給出一些電話號碼,詢問是否某個電話號碼是其他電話號碼的前綴,有輸出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 ;
}