NEOJ 267 自動完成系統
題目連結 Submission
題目敘述點這裡 有FB Hacker Cup的原題連結,簡單來說就是想像手機的自動填入系統,每加入一個字串會記錄到資料庫中,當資料庫裡面沒有相同前綴的字串時就輸出前綴長度。
用字典樹Trie插入每一個字串,插入過程中返回從頭到開始new新的節點之間經過的節點樹,代表需要輸入多少個字元才能觸發自動完成系統。這一題是基礎的Trie應用。
程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 #include <bits/stdc++.h> #define ll long long #define ld long double #define N 1000005 #define Orz ios::sync_with_stdio(0),cin.tie(0) #define INF 2e18 #define rep(i,l,r) for(int i=l;i<=r;i++) #define pii pair<int,int> #define x first #define y second using namespace std;int t,n;char S[N];int ch (char a) { return a-'a' ; } struct Trie { Trie* c[26 ]; Trie (){ memset (c,0 ,sizeof (c)); } }; Trie *root = new Trie (); int insert (char *S) { Trie *ptr = root; int step = 0 ,f = 1 ; while (*S){ if (f)step++; if (!ptr->c[ch (*S)]){ ptr->c[ch (*S)] = new Trie (); f = 0 ; } ptr = ptr->c[ch (*S)]; S++; } return step; } void clear (Trie *s) { for (int i=0 ;i<26 ;i++){ if (s->c[i]){ clear (s->c[i]); delete s->c[i]; s->c[i] = nullptr ; } } } int main () { cin>>t; int cnt = 0 ; while (t--){ cnt++; cin>>n; int step = 0 ; rep (i,0 ,n-1 ){ cin>>S; step +=insert (S); } cout<<"Case #" <<cnt<<": " <<step<<endl; clear (root); } }