第一次敲字典树还是在去年,就只做了一道,结果今年碰到几个字典树的题,结果都没做掉。
重新再学一遍。。。(这就是去年敲的那道题,又重新敲了一遍)
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX = 26;struct Trie {Trie *next[MAX];char *c;Trie() {c = NULL;memset(next, NULL, sizeof(next));}
};Trie *Root = new Trie;void CreTrie(char *str, char *str1)
{int len = strlen(str);Trie *p = Root;for (int i = 0; i < len; ++i) {int pos = str[i] - 'a';if (NULL == p->next[pos]) {p->next[pos] = new Trie;}p = p->next[pos];}p->c = new char[10];strcpy(p->c, str1);
}char* FinTrie(char *str) {int len = strlen(str);Trie *p = Root;for (int i = 0; i < len; ++i) {int pos = str[i] - 'a';if (NULL == p->next[pos]) {return str;}p = p->next[pos];}if (p->c != NULL) { return p->c; }return str;
}void DelTrie(Trie *T)
{for (int i = 0; i < MAX; ++i) {if (T->next[i]) {DelTrie(T->next[i]);}}delete[] T;
}bool Judge(char ch)
{if (ch >= 'a' && ch <= 'z') {return true;}else {return false;}
}int main()
{//freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);char str[3000], str1[10], str2[10];scanf("%s", str1);while (scanf("%s", str1) && 0 != strcmp(str1, "END")) {scanf("%s", str2);CreTrie(str2, str1);}scanf("%s", str1);getchar();while (gets(str) && 0 != strcmp(str, "END")) {char word[3000], ans[3000];memset(word, 0, sizeof(word));int len = strlen(str);int w_len = 0;for (int i = 0; i < len; ++i) {if (Judge(str[i])) { word[w_len++] = str[i]; }else {printf("%s", FinTrie(word));printf("%c", str[i]);w_len = 0;memset(word, 0, sizeof(word));}}printf("\n");}DelTrie(Root);return 0;
}