当前位置:   article > 正文

Trie树习题--三连_trie树上dp好题

trie树上dp好题

一连:POJ  1056   http://poj.org/problem?id=1056

题意:问是否有一个串S,S是另一个字符串的前缀

思路:直接Trie建立,再从头遍历一遍,要注意的是,自己是自己的前缀,统计前缀个数时要注意一下

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = 1e4;
  6. int trie[maxn][2];
  7. int tot = 0;
  8. int sum[maxn];
  9. string str;
  10. string s[105];
  11. int idx(char s){return s -'0';}
  12. void Insert(string s)
  13. {
  14. int u = 0, len = s.length();
  15. for(int i = 0; i < len; i++){
  16. int c = idx(s[i]);
  17. if(!trie[u][c]) trie[u][c] = ++tot;
  18. sum[trie[u][c]]++;
  19. u = trie[u][c];
  20. }
  21. }
  22. int findout(string s)
  23. {
  24. int u = 0, len = s.length();
  25. for(int i = 0; i < len; ++i){
  26. int c = idx(s[i]);
  27. if(!trie[u][c]) return 0;
  28. u = trie[u][c];
  29. }
  30. return sum[u];
  31. }
  32. int main()
  33. {
  34. int cas = 1;
  35. while(cin >> str){
  36. for(int i = 0; i < maxn; i++){
  37. for(int j = 0; j < 2; j++)
  38. trie[i][j] = 0;
  39. }
  40. memset(sum, 0, sizeof(sum));
  41. int flag = 1;
  42. Insert(str);
  43. int cnt = 0;
  44. cin >> s[cnt];
  45. while(s[cnt][0] != '9'){
  46. Insert(s[cnt]);
  47. cnt++;
  48. cin >> s[cnt];
  49. }
  50. if(findout(str) > 1) flag = 0;
  51. for(int i = 0; i < cnt; i++){
  52. if(findout(s[i]) > 1){
  53. flag = 0;
  54. break;
  55. }
  56. }
  57. if(flag == 0) printf("Set %d is not immediately decodable\n",cas++);
  58. else if(flag == 1) printf("Set %d is immediately decodable\n",cas++);
  59. }
  60. return 0;
  61. }

二连:POJ 2001 http://poj.org/problem?id=2001

题意:给你一堆字符串,让你给出每个字符串的最短标识前缀(即这个前缀只存于这一个字符串中)

思路:建立Trie树时,用一个sum数组记录结点存储信息,在find字符串过程中,跑到只记录了一次的点结束(因为这个点只记录了一次,那么这个点一定是该点所在字符串与其它字符串不一样的地方)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = 2e4;
  6. int trie[maxn][26];
  7. int idx(char c){return c - 'a';}
  8. int tot = 0;
  9. int sum[maxn];
  10. string s[1005];
  11. void insert(string s)
  12. {
  13. int u = 0, len = s.length();
  14. for(int i = 0; i < len; i++){
  15. int c = idx(s[i]);
  16. if(!trie[u][c]) trie[u][c] = ++tot;
  17. u = trie[u][c];
  18. sum[u]++;
  19. }
  20. }
  21. void findout(string s)
  22. {
  23. int u = 0, len = s.length();
  24. for(int i = 0; i < len; i++){
  25. int c = idx(s[i]);
  26. if(sum[u] == 1) return;
  27. printf("%c", s[i]);
  28. u = trie[u][c];
  29. }
  30. }
  31. int main()
  32. {
  33. int cnt = 0;
  34. while(cin>>s[cnt]){
  35. insert(s[cnt]);
  36. cnt++;
  37. }
  38. for(int i = 0; i < cnt; i++){
  39. cout << s[i] << " " ;
  40. findout(s[i]);
  41. cout << '\n';
  42. }
  43. return 0;
  44. }

三连:POJ 2503  http://poj.org/problem?id=2503

题意:给你两堆字符串,一一对应, 类似于明文/密文转换问题

思路:(直接map就可以)在建立Trie树的过程中,在最后一个结点连接上英语串,trie用个struct数组,多附加一个char[]

另外注意输入格式,空行的问题,(getch, sscanf考虑一下)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = 1e6+5;
  6. struct Trie
  7. {
  8. char word[11];
  9. int next[30];
  10. }trie[maxn];
  11. int tot;
  12. int idx(char c){return c - 'a';}
  13. void insert(char str[], char s[])
  14. {
  15. int u = 0, len = strlen(s);
  16. for(int i = 0; i < len; ++i){
  17. int c = idx(s[i]);
  18. if(!trie[u].next[c]) trie[u].next[c] = ++tot;
  19. u = trie[u].next[c];
  20. }
  21. strcpy(trie[u].word, str);
  22. }
  23. void findout(char s[])
  24. {
  25. int u = 0, len = strlen(s);
  26. for(int i = 0; i < len; ++i){
  27. int c = idx(s[i]);
  28. if(!trie[u].next[c]){
  29. cout << "eh" << '\n';
  30. return;
  31. }
  32. u = trie[u].next[c];
  33. }
  34. cout << trie[u].word << '\n';
  35. }
  36. int main()
  37. {
  38. char s1[12], s2[12], ch[30];
  39. while(gets(ch)){
  40. if(ch[0] == 0) break;
  41. sscanf(ch,"%s %s", s1, s2);
  42. insert(s1, s2);
  43. }
  44. while(~scanf("%s", s2)){
  45. findout(s2);
  46. }
  47. return 0;
  48. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/727740
推荐阅读
相关标签
  

闽ICP备14008679号