Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 16990 | Accepted: 7364 |
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
Source
ac:
#include<cstdio> #include<stack> #include<iostream> #include <cstring> #include <string> #include <vector> using namespace std; typedef struct node{ int count; struct node* next[27]; node(int _count = 0) { count = _count; int i; for(i = 0 ; i < 27 ; i ++) { next[i] = NULL; } } }Trie; void insertNode(Trie* trie , string s, int len) { Trie* t = trie; int i = 0; for(i = 0 ;i < len ; i ++) { int tmp = s[i]-'a'; if(t->next[tmp] == NULL){ t->next[tmp] = new node(0); } t = t->next[tmp]; // 这两个的顺序不能弄错 t->count ++; } } int findrs(Trie *trie, string s, int len) { Trie* t = trie; int i = 0; for(i = 0 ;i < len ; i ++) { int tmp = s[i]-'a'; if(t->next[tmp] == NULL) return -1; if(t->next[tmp]->count == 1) return i + 1 ; t = t->next[tmp]; } return len; } int main() { //freopen("in.txt","r",stdin); Trie* trie = new node(0); int i = 0; vector<string> v; vector<int> vlen; string s; while(getline(cin, s)) { int len = s.length(); v.push_back(s); vlen.push_back(len); insertNode(trie , s, len); i ++; } for(int j = 0 ; j < i ; j ++) { string rs = v[j].substr(0,findrs(trie, v[j], vlen[j])); cout << v[j] << " " << rs << endl; } return 0; }
借用字典数,存储单词, 把出现字母的次数记录下来
当 某个字母出现次数为1时,表示从树根到此位置组成的字母串 是能够代表一个单词的