Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 15574 | Accepted: 6719 |
Description
Input
Output
Sample Input
carbohydrate cart carburetor caramel caribou carbonic cartilage carbon carriage carton car carbonate
Sample Output
carbohydrate carboh cart cart carburetor carbu caramel cara caribou cari carbonic carboni cartilage carti carbon carbon carriage carr carton carto car car carbonate carbona看完题后,感慨:简直不能忍,这么裸的字典树,接下来就是无脑式敲 Trie 树了,这个题目可以拿来练练手速~。另外,一时没到比较合适的函数名,望 勿喷
题解就略了,容我贴下代码~
/****************************>>>>HEADFILES<<<<****************************/ #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <string> #include <cstring> #include <iomanip> #include <iostream> #include <sstream> #include <algorithm> using namespace std; /****************************>>>>>DEFINE<<<<<*****************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") #define FIN freopen("input.txt","r",stdin) #define FOUT freopen("output.txt","w",stdout) #define rep(i,a,b) for(int i = a;i <= b;i++) #define rep1(i,a) for(int i = 1;i <= a;i++) #define rep0(i,a) for(int i = 0;i < a;i++) #define MP(a,b) make_pair(a,b) #define PB(a) push_back(a) #define fst first #define snd second #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 /****************************>>>>>>DEBUG<<<<<<****************************/ #define out(x) cout<<x<<"" /****************************>>>>SEPARATOR<<<<****************************/ const int maxk = 26; const int maxl = 20+5; int N,M; struct Node { int cnt; Node* pNext[maxk]; Node() : cnt(0) { rep0(i,maxk) pNext[i] = NULL; } }; struct Trie { Node* const pRoot; Trie() : pRoot(new Node()) {} void AddWord(const char str[],int len); // int FindPredix(const char str[],int len); void Fuck(const char str[],int len); void Release(const Node *p); }dic; void Trie::AddWord(const char str[],int len) { Node* ptr = pRoot; for(int i = 0;i < len;i++) { int nPos = str[i] - 'a'; if(ptr->pNext[nPos] == NULL) ptr->pNext[nPos] = new Node(); ptr->cnt++; ptr = ptr->pNext[nPos]; } ptr->cnt++; } void Trie::Release(const Node* p) { for(int i = 0;i < maxk;i++) if(p->pNext[i] != NULL) Release(p->pNext[i]); delete p; } void Trie::Fuck(const char str[],int len) { Node* ptr = pRoot; for(int i = 0;i < len;i++) { int nPos = str[i] - 'a'; if(ptr->pNext[nPos] == NULL) return; if(ptr->cnt == 1) return; putchar(str[i]); ptr = ptr->pNext[nPos]; } } char buf[1005][maxl]; int main() { //FIN; int cnt = 0; while(~scanf("%s",buf[cnt])) dic.AddWord(buf[cnt],strlen(buf[cnt])),cnt++; for(int i = 0;i < cnt;i++) { printf("%s ",buf[i]); dic.Fuck(buf[i],strlen(buf[i])); puts(""); } dic.Release(dic.pRoot); return 0; }