Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 14250 | Accepted: 6140 |
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
字典树。。。
我之前一直运行都没过,,原来是root没初始化。。。。不过我发现一些好玩的东西,,
首先
AC代码1(树结构用的结构体,创建时用malloc,输入时cin,532K, 0ms):
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> using namespace std; struct node { int cnt; struct node *next[26]; }; char str[1005][25]; node *root; void insert(char *s) { node *p = root; for(char *q = s; *q != '\0'; q++) { if(p->next[*q-'a'] == NULL) { p->next[*q-'a'] = (node*)malloc(sizeof(node)); memset(p->next[*q-'a'], 0, sizeof(node)); } p = p->next[*q-'a']; p->cnt++; } } void search(char *s) { node *p = root; for(int i=0; s[i] != '\0'; i++) { printf("%c", s[i]); p = p->next[s[i]-'a']; if(p->cnt==1) break; } printf("\n"); } int main() { root = (node*)malloc(sizeof(node)); memset(root, 0, sizeof(node)); int num = 0; while(cin >> str[num]) { insert(str[num]); num++; } for(int i=0; i<num; i++) { printf("%s ", str[i]); search(str[i]); } return 0; }
AC代码2(结构体里用一个构造函数,528K,47ms,略慢。。好奇怪):
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> using namespace std; struct node { int cnt; struct node *next[26]; node() //构造函数,就是在你申请一个节点空间时,把节点初始化 { cnt = 0; memset(next, 0, sizeof(next)); } }; char str[1005][25]; node *root; void insert(char *s) { node * p = root; for(size_t i = 0; i < strlen(s); i++) { if(p->next[ s[i] - 'a'] == NULL) p->next[ s[i] - 'a'] = new node; p = p->next[ s[i] - 'a']; p->cnt ++; } } void search(char *s) { node *p = root; for(int i=0; s[i] != '\0'; i++) { printf("%c", s[i]); p = p->next[s[i]-'a']; if(p->cnt==1) break; } printf("\n"); } int main() { root = new node; int num = 0; while(cin >> str[num]) { insert(str[num]); num++; } for(int i=0; i<num; i++) { printf("%s ", str[i]); search(str[i]); } return 0; }
AC代码3(c++的class和构造函数,528K,0ms):
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> using namespace std; class node { public: int cnt; node *next[26]; node() //构造函数,就是在你申请一个节点空间时,把节点初始化 { cnt = 0; memset(next, 0, sizeof(next)); } }; char str[1005][25]; node *root; void insert(char *s) { node * p = root; for(size_t i = 0; i < strlen(s); i++) { if(p->next[ s[i] - 'a'] == NULL) p->next[ s[i] - 'a'] = new node; p = p->next[ s[i] - 'a']; p->cnt ++; } } void search(char *s) { node *p = root; for(int i=0; s[i] != '\0'; i++) { printf("%c", s[i]); p = p->next[s[i]-'a']; if(p->cnt==1) break; } printf("\n"); } int main() { root = new node; int num = 0; while(cin >> str[num]) { insert(str[num]); num++; } for(int i=0; i<num; i++) { printf("%s ", str[i]); search(str[i]); } return 0; }