Shortest Prefixes POJ - 2001 (Trie樹基本運用)
阿新 • • 發佈:2018-11-06
題意:
給定多個單片語成的詞典, 輸出每個單詞對應的字首, 使得每個字首唯一.
如果不存在就輸出單詞本身. 也就是:找出一個字首,該字首能唯一表示該字串.
分析:
建立Trie樹,每個節點的V代表有多少個字串路徑上含有它.
Find函式裡查詢每個單詞的字首,知道v值==1返回即可.
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int maxn = 1e7+11; struct node { int ch[maxn][26]; int v[maxn]; int sz; void init() { sz=1; memset(ch[0],0,sizeof ch[0]); v[0]=0; } void insert(char *s) { int n=strlen(s),u=0; for(int i=0;i<n;i++) { int id=s[i]-'a'; if(!ch[u][id]) { ch[u][id]=sz; memset(ch[sz],0,sizeof ch[sz]); v[sz]=0; sz++; } u=ch[u][id]; v[u]++; } } void find(char *s) { int n=strlen(s),u=0; for(int i=0;i<n;i++) { int id=s[i]-'a'; u=ch[u][id]; printf("%c",s[i]); if(v[u]==1)//該字元已經能唯一標示該單詞 return; } } }trie; int main() { char word[1111][33]; trie.init(); int cnt=0; while(scanf("%s",word[cnt])==1) { trie.insert(word[cnt++]); } for(int i=0;i<cnt;i++) { printf("%s ",word[i]); trie.find(word[i]); puts(""); } }