字典树 之 hdu 1247
/*
放了一天,晚上突然想出其这道题哪里出了问题。。。悲催的Runtime Error(ACCESS_VIOLATION)
此题思路:
1)建字典树
2)尝试把每个单词拆成两个单词的所有情况,判断这两个单词是否都在字典树中
若为true,输出该单词;否则不输出该单词
做题中碰到的问题:
1)一直用string,结果指针用的很悲催。。。(程序中对错误的使用指针做了解释)
2)学到了strncpy这个很棒的函数
3)搜索串时,由于把每个单词拆开,故要防止访问空指针(考虑的不周全啊!!!)
*/
1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 const int MAX = 26; 7 8 struct Trie { 9 bool Judge; 10 Trie *next[MAX]; 11 Trie() { 12 Judge = false; 13 memset(next, NULL, sizeof(next)); 14 } 15 }; 16 17 Trie *Root = new Trie; 18 19 void CreTrie(char *str) 20 { 21 int len = strlen(str); 22 Trie *p = Root; 23 for (int i = 0; i < len; ++i) { 24 int pos = str[i] - 'a'; 25 if (!(p->next[pos])) { 26 p->next[pos] = new Trie; 27 } 28 p = p->next[pos]; 29 } 30 p->Judge = true; 31 } 32 33 bool SeTrie(char *str) 34 { 35 int len = strlen(str); 36 Trie *p = Root; 37 for (int i = 0; i < len; ++i) { 38 int pos = str[i] - 'a'; 39 if (!(p->next[pos])) { // 防止搜索串时,访问空指针 40 return false; 41 } 42 p = p->next[pos]; 43 } 44 return p->Judge; 45 } 46 47 void DelTrie(Trie *T) 48 { 49 for (int i = 0; i < MAX; i++) { 50 if (T->next[i]) { 51 DelTrie(T->next[i]); 52 } 53 } 54 delete[] T; 55 } 56 57 int main() 58 { 59 //freopen("input.txt", "r", stdin); 60 //freopen("output.txt", "w", stdout); 61 char str[50]; 62 char** arr = new char*[50000]; 63 int n = 0; 64 while (~scanf("%s", str)) { 65 arr[n] = new char[50]; 66 strcpy(arr[n], str); 67 /* 68 此处绝不可以用 arr[n] = str 赋值: 69 str指向 存储的是50个 char 值的内存块的第一个元素, 70 即存储第一个元素的地址,地制值始终未变, 71 赋给 arr[i] 的值也始终未变, 72 故而arr[i] 都指向了最后输入的字符串的第一个元素, 73 结果输出值也就是最后一个字符串。 74 */ 75 n++; 76 CreTrie(str); 77 } 78 79 for (int i = 0; i < n; ++i) { 80 int len = strlen(arr[i]); 81 for (int j = 1; j < len - 1; ++j) { 82 char temp1[50] = { '\0' }, temp2[50] = { '\0' }; 83 strncpy(temp1, arr[i], j); 84 strncpy(temp2, arr[i] + j, (len - j)); 85 //cout << temp1 << " " << temp2 << endl; 86 if (SeTrie(temp1) && SeTrie(temp2)) { 87 printf("%s\n", arr[i]); 88 break; 89 } 90 } 91 } 92 DelTrie(Root); 93 for (int i = 0; i < n; i++) { 94 delete[] arr[i]; 95 } 96 return 0; 97 }