poj-2001(字典樹)
阿新 • • 發佈:2018-08-22
turn ios 找不到 clas while 開始 字符串 我們 main
題意:給你一堆字符串,我們定義一個字符串可以被縮寫成一個字符串(必須是原字符串的前綴),問你每個字符串能辨識的前綴是什麽,不能辨識意思是(ab,abc我們縮寫成ab);
解題思路:可以用字典樹解決,我們把剛開始的串存進去,然後在詢問的時候,如果當前節點的字符只被一個串走過,那麽肯定可以辨識;如果遍歷完了找不到·,那麽輸出他自己;
代碼:
#include<iostream> #include<algorithm> #include<cstdio> #include<string> #include<cstring> #define maxn 50050 using namespace std; int trie[maxn][30]; string s[2050]; string a; int cnt[maxn]; int root; int tot; void build_trie(string s) { root=0; int slen=s.size(); for(int i=0;i<slen;i++) { int id=s[i]-‘a‘; if(!trie[root][id]) { trie[root][id]=++tot; } root=trie[root][id]; cnt[root]++; } } int query(string s) { root=0; int slen=s.size(); for(int i=0;i<slen;i++) { int id=s[i]-‘a‘; if(cnt[root]==1) { return i-1; } root=trie[root][id]; } return slen-1; } int main() { int cot=0; while(cin>>a) { s[++cot]=a; build_trie(a); } for(int i=1;i<=cot;i++) { int pos=query(s[i]); cout<<s[i]<<" "; for(int j=0;j<=pos;j++) cout<<s[i][j]; cout<<endl; } }
poj-2001(字典樹)