0%

[題解]NEOJ 267 自動完成系統

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);
}
}