poj3630 || hdoj1671(トライ)

トピックリンクします。https://vjudge.net/problem/HDU-1671

問題の意味:与えられたn個の文字列は、他のいくつかの文字列が接頭文字列であるか否かを判断します。

アイデア:

  テンプレートのセット、二つの状況かもしれ接頭辞があります:

    数字を列挙するとき、現在の文字列の文字列がすでに存在する前に、(すなわち、既に存在911、現在の挿入9112)

      終了文字列または現在の列挙、ならびにノードの子ノードの後。(すなわち9112が既に存在している、現在の挿入911)

ACコード:

書式#include <cstdioを> 
する#include <アルゴリズム> 
書式#include <CStringの>
 使用して 名前空間をSTD。

const  int型 MAXN = 1E6 + 5 INT T、N、トライ[MAXN] [ 12 ]、鍵[MAXN]、CNT。
int型のフラグ。
文字列str [ 12 ]。

ボイドインサート(CHAR * S){
     int型 LEN = STRLEN(S)、uは= 0 以下のためにINT iが= 0 ; I <LEN; ++ I){
         int型 T = S [I] - ' 0 ' もし(!トライ[U] [T]){
             ++ CNT。
            memsetの(トライ[CNT]、0はsizeof (トライ[CNT]))。
            [CNT]キー = 0 
            トライ[U] [T] = CNT。
        } 
        場合(キー[トライ[U] [T]]){ 
            フラグ = 0 リターン; 
        } 
        、U = トライ[U] [T]。
        もし(I == len- 1)キー[U] = 1 
    } 
    ためINT iが= 0 ; iが<10 ; ++ i)が
         あれば(トライ[U] [I]){ 
            フラグ = 0 休憩; 
        } 
} 

int型のmain(){ 
    scanf関数(" %のD "、&T)。
    一方、(T-- ){ 
        scanf関数(" %のD "、&N)
        memsetの(トライ[ 0 ]、0はsizeof(トライ[ 0 ])); 
        フラグ = 1、CNT = 0 以下のためのint型iは= 0、I <N; ++ I){ 
            scanf関数(" %S " 、STR)。
            もし(フラグ)インサート(STR)。
        } 
        であれば(フラグ)のprintf(" YES \ n " );
        のprintf(" NO \ N " ); 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11829478.html