1. 程式人生 > >【Trie樹】模板題-POJ-2001

【Trie樹】模板題-POJ-2001

題意:

給你若干個單詞,寫出能每個單詞的最短字首

也就是說這個字首能準確代表這個單詞,和其他單詞 without ambiguity 

思路:

建立字典樹存下這幾個單詞,ct 陣列記錄每個節點的子節點數,顯然子樹寬度只有1的話,這個單詞就被確定了,改造一下我們的 find_word 函式就行啦

哦。。這個結構體要怎麼搞還坑了我一下,要向下面那樣定義!

程式碼:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxnode = 20050;
const int sigma_size = 30;

char str[1050][25];

///字母表為全體小寫字母的 Trie
struct Trie
{
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int ct[maxnode];
    int sz;         ///節點總數
    Trie() { sz = 1; memset(ch[0],0,sizeof(ch[0])); memset(ct,0,sizeof(ct)); }       ///初始時只有一個根節點
    int idx (char c) { return c - 'a'; }    ///字元c的編號

    ///插入字串 s, 附加資訊為 v。 注意 v 必須非0,因為 0 代表“本節點不是單詞節點”
    void insert_word(char *s,int v){
        int u = 0, n = strlen(s);
        for(int i=0; i<n; i++){
            ct[u]++;
            int c = idx(s[i]);
            if(!ch[u][c]) {
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz] = 0;
                ch[u][c] = sz++;
            }
            u = ch[u][c];
        }
        val[u] = v;
        ct[u]++;
    }

    void find_word(char *s){
        int u = 0, n = strlen(s);
        for(int i=0; i<n; i++){
            int c = idx(s[i]);
            printf("%c",s[i]);
            u = ch[u][c];
            if(ct[u] == 1)break;
        }
        printf("\n");
    }
}my_trie;

int main()
{
    freopen("input.txt","r",stdin);
    int top = 0;
    while(scanf("%s",str[top]) != EOF){
        //cout<<str[top]<<endl;
        my_trie.insert_word(str[top],1);
        top++;
    }
    for(int i=0;i<top;i++)
    {
        printf("%s ",str[i]);
        my_trie.find_word(str[i]);
    }
    return 0;
}


相關推薦

Trie模板-POJ-2001

題意: 給你若干個單詞,寫出能每個單詞的最短字首 也就是說這個字首能準確代表這個單詞,和其他單詞 without ambiguity  思路: 建立字典樹存下這幾個單詞,ct 陣列記錄每個節點的子節點數,顯然子樹寬度只有1的話,這個單詞就被確定了,改造一下我們的 find_

HDU1251 統計難題 trie

courier ava 自己的 while onos ets ctrl pan alloc 統計難題 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Other

poj3764 The XOR Longest PathdfsTrie

print 思路 https per span dfs pre between col The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10038

Codeforces 514C Watto and Mechanism Trie+DFS

<題目連結> 題目大意:輸入n個單詞構成單詞庫,然後進行m次查詢,每次查詢輸入一個單詞(注意這些單詞只由a,b,c構成),問該單詞庫中是否存在與當前查詢的單詞有且僅有一個字元不同的單詞。 解題分析:本題將單詞庫中所有的單詞先建trie樹,然後進行容錯數為1的字串匹配,主要是在trie樹上跑DF

Codeforces 633C Spy Syndrome 2 Trie+DFS

print net bool void bre ret 給定 pri mar <題目鏈接> 題目大意:給定一個只有小寫字母組成的目標串和m個模式串(裏面可能有大寫字母),記目標串反過來後的串為S,讓你從m個模式串中選出若幹個組成S串(不區分大小寫)。輸出任意一

CH1602 The XOR Largest PairTrie

1602 The XOR Largest Pair 0x10「基本資料結構」例題 描述 在給定的N個整數A1,A2……AN中選出兩個進行xor運算,得到的結果最大是多少? 輸入格式 第一行一個整數N,第二行N個整數A1~AN。 輸出格式 一個整數表示答案。 樣例輸入 3 1 2 3

CH601字尾陣列Trie

內含字典樹建立及查詢模板 1601 字首統計 0x10「基本資料結構」例題 描述 給定N個字串S1,S2...SN,接下來進行M次詢問,每次詢問給定一個字串T,求S1~SN中有多少個字串是T的字首。輸入字串的總長度不超過10^6,僅包含小寫字母。 輸入格式 第一行兩個整數N,M。接下來N行

trieHDU4825 Xor Sum

Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 5864 Accepted Submission

triePOJ2001Shortest Prefixes

Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22161 Accepted: 9470 Description A prefix of a

trieHDU1247Hat’s Words

Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19500 Accepted Submiss

Trie啟發式合併2019雅禮集訓 matrix

題目: 定義一個矩陣的貢獻為:其互不相同的行的種類數。 給出一個矩陣,求其所有子矩陣的貢獻和。 分析: 可以把每一行拿出來,弄成一個字串,建一顆Trie樹出來。 此時,就可以算出以最左端為左邊界的所有子矩陣的貢獻。 算完後,把第一層節點合併,相當於去除了第一列的

trieP4551 最長異或路徑

fin cas 最長 build ast spa 動態 疑惑 check Description 給定 \(n\) 個點的帶邊權樹,求一條異或和最大的簡單路徑 Input 第一行是點數 \(n\) 下面 \(n - 1\) 行每行三個整數描述這棵樹 Output 輸出一個數

模板trie ,第二可作模板

上一次看到資料結構,忙著我的圖論,匆匆幾眼就看過去了。 這一次終於可以好好學習一番了; 網上資料有很多, 給我的感覺就是,建立一棵樹,然後將26或者52 個字母,分成26叉樹, 由此我們可以讓很多字串公用同一個字首, 可以處理很多統計,啥啥的問題,以後做

POJ 2001 Shortest Prefixes trie(別名字典)

Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15574 Accepted: 6719 Description A prefix of a strin

POJ 3903 Stock Exchange 最長上升子序列模板

com ++ 特點 pri 解析 class span 表示 problem 題目鏈接:http://poj.org/problem?id=3903 轉載於:https://www.cnblogs.com/GodA/p/5180560.html 題目大意: 裸的DP最長

雜湊&KMP模板-POJ-3461-Oulipo

題目描述:給一個子串再給一個主串,問子串在主串中出現了多少次。裸題一道,用來試驗雜湊和kmp模板 解題思路&AC程式碼: (哎呀我去。。這題都要背下來了  = = ①--HASH首先,我覺得雜湊好寫還好理解,先寫了一個雜湊的程式碼,所謂雜湊就是給字串生成一個雜湊值

線段洛谷 P3372 模板線段 1

tree dtree cnblogs oot ++ query urn true typedef 動態開結點線段樹板子。 #include<cstdio> using namespace std; typedef long long ll; ll s

BZOJ5338 [TJOI2018] Xor 可持久化Triedfs序

%d print num color style printf second 進行 AS 題目分析:   很無聊的一道題目。首先區間內單點對應異或值的詢問容易想到trie樹。由於題目在樹上進行,case1將路徑分成兩段,然後dfs的時候順便可持久化trie樹做詢問。case

線段P3372模板-線段

1.5 情況 一行 標記 ask lan build put 同時 百度百科 Definition&Solution   線段樹是一種log級別的樹形結構,可以處理區間修改以及區間查詢問題。期望情況下,復雜度為O(nlogn)。    核心思想見百度百科,線段

HDU1575-Tr 矩陣快速冪(模板)

target bsp .net code test tdi init ace contest <題目鏈接> A為一個方陣,則Tr A表示A的跡(就是主對角線上各項的和),現要求Tr(A^k)%9973。 Input 數據的第一行是一個T,表示有T組數據。