N - 接頭辞セット(第1面を見つけるためにトライ木は、より相手の接頭文字列の文字列よりも)

タイトル

出力フォーマットの
セットが有効であれば、出力GOODのSET。
そうでなければ、出力BAD SETは、条件が失敗したため最初の文字列が続きます。

サンプルInput00

7
AAB
defgab
ABCDE
aabcde
cedaaa
bbbbbbbbbb
jabjjjad

サンプルOutput00

BAD SET
aabcde

サンプルInput01

4
AAB
AAC
aacghgh
aabghgh

サンプルOutput01

BADのSET
aacghgh

説明
AABはaabcdeの接頭辞です。だから、セットはBAD設定され、それが文字列aabcdeで失敗します。

説明

この質問は唯一の非遵守、直接挿入機能改善の文字列を検索することから、問い合わせなしに、辞書の木を使用してください。
預金ANS答えのグローバル配列を設定します。各文字が同時にフラグを更新トライノードに挿入され、記録フラグは、フラグiの値であるiノードの文字列を、被覆されています。各フラグの初期値は-1、両方のノードであり、実際には、特にカバー我々は唯一、気にしない人で、この位置は既にこのルート上の文字列の存在を示す、文字列を占領していない前に、ノードを気に。現在の文字列が最後のフラグの値がない場合は-1、ストリング(セクションI)の上側リンクよりも短い現在の文字列は、その結果であることを示します。
IF((ノード- > = -1が存在)||(* P == '\ 0' &&ノード- >のフラグ= -1)!){
strcpyの(ANS、ワード);
戻りN-;
}
これは正しい場合であります半分が書かれた理由は、例えば、ABCABC、このような状況を経験した後、ABCのために、ケースの外に落ちるのは簡単です。その後、別の場合、後で遭遇短い、長い文字列の既存の文字列について話しています。例えばABC、ABCABC(コンパクトで例えば多くて、)。
私たちは、実現された結果の最初の位置cにする必要があります。辞書ツリー内の各文字の最後の文字を挿入すると、値が初期値でない場合も同様に、我々は、短期で、それが何であるかを値どのくらいこのノードが存在を気にしない、我々は数字の現在の文字列iの値を更新する存在になるということです-1。このノードは、文書の文字列の末尾に既に説明停止以上の文字があることを文字の現在の文字列の両方が文字列とバーの上に重畳されていたの(I条)。言葉遣い左半分場合とそう。
結果を見つけた後うまくない辞書ツリーに、文字列の残りの部分を読むことを忘れないでください、最終的な出力はANS。

広げます

この質問は、複数の文字列の重複に関係していないが、最初の数次のコード列と重なるように決定することができますが。

#include <cstdio>
#include <cstring>
#include <cstdlib>
typedef struct node{
    int cont;
    struct node *next[26];
    int exist;
    int flag;
}trieNode, *Trie;
char ans[100];
Trie  buildtrieNode(){
    Trie node = (Trie)malloc(sizeof(trieNode));
    node->cont = 0;
    node->exist = -1;
    node->flag = -1;
    memset(node->next, 0, sizeof(node->next));
    return node;
}
int trieNode_insert(char *word, Trie root, int n){
    Trie node = root;
    int id;
    char *p = word;
    while(*p){
        id = *p - 'a';
        if(node->next[id] == NULL){
           node->next[id] = buildtrieNode();
        }
        node = node->next[id];

        p++;
        node->cont++;
        if((node->exist != -1)||(*p == '\0' && node->flag != -1)){
            strcpy(ans, word);
            return n;
        }
        node->flag = n;
    }
    node->exist  = n;
    return 0;
}
int main(){
    int n, i;
    char s[1000];
    int cont = 0;
    Trie root = buildtrieNode();
    int flag = 0;
    scanf("%d", &n);
    for(i = 1; i <= n; i++){
        scanf("%s", s);
        if(!flag)
        flag = trieNode_insert(s, root, i);

    }
    if(flag) printf("BAD SET\n%s", ans);
    else printf("GOOD SET");
    return 0;
}
发布了52 篇原创文章 · 获赞 2 · 访问量 901

おすすめ

転載: blog.csdn.net/qq_44714572/article/details/97406162