トピックリンクします。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 。 }