PKU 3630 - Phone List(Trie)

题意

查找是否有串是其他串的子串。

思路

一开始的思路是将串按长度排序,如果有串走完了以后那个位置已经被人走过,就是子串,用的是new的方式,MLE了。

后来释放了一下内存,TLE了。看了别人的题解,原来用静态的Trie才能过。

改了一下静态,过了。值得一提的是一开始的版本我在HDU上提交是500ms,静态版本提交是60ms,虽然算法有有一点变化,但是效率差34倍是有的。怪不得LRJ老师用的是静态版本。

代码

  
  
  
  
  1. #include <cstdio>
  2. #include <stack>
  3. #include <set>
  4. #include <iostream>
  5. #include <string>
  6. #include <vector>
  7. #include <queue>
  8. #include <functional>
  9. #include <cstring>
  10. #include <algorithm>
  11. #include <cctype>
  12. #include <ctime>
  13. #include <cstdlib>
  14. #include <fstream>
  15. #include <string>
  16. #include <sstream>
  17. #include <map>
  18. #include <cmath>
  19. #define LL long long
  20. #define lowbit(x) ((x) & (-x))
  21. #define MP(a, b) make_pair(a, b)
  22. #define MS(arr, num) memset(arr, num, sizeof(arr))
  23. #define PB push_back
  24. #define F first
  25. #define S second
  26. #define ROP freopen("input.txt", "r", stdin);
  27. const double PI = acos(-1.0);
  28. const int INF = 0x3f3f3f3f;
  29. using namespace std;
  30. const int MAXN = 10000 + 5;
  31. typedef pair<int, int> pii;
  32. typedef vector<int>::iterator viti;
  33. typedef vector<pii>::iterator vitii;
  34. struct TRIE
  35. {
  36. int ed, pass;
  37. int next[10];
  38. }trie[MAXN * 10];
  39. int cnt;
  40. char str[15];
  41. bool Insert(int root, char *str)
  42. {
  43. int cur = root;
  44. for (int i = 0; str[i]; i++)
  45. {
  46. int idx = str[i] - '0';
  47. if (trie[cur].next[idx] == 0)
  48. trie[cur].next[idx] = ++cnt;
  49. cur = trie[cur].next[idx];
  50. trie[cur].pass++;
  51. if (trie[cur].ed) return false;
  52. }
  53. if (trie[cur].pass > 1) return false;
  54. trie[cur].ed = 1;
  55. return true;
  56. }
  57. int main()
  58. {
  59. //ROP;
  60. int T, i, j, n;
  61. scanf("%d", &T);
  62. while(T--)
  63. {
  64. cnt = 0;
  65. MS(trie, 0);
  66. scanf("%d%*c", &n);
  67. bool flag = false;
  68. for (i = 0; i < n; i++)
  69. {
  70. gets(str);
  71. if (flag) continue;
  72. if (Insert(0, str) == false) flag = true;
  73. }
  74. printf("%s\n", flag ? "NO" : "YES");
  75. }
  76. return 0;
  77. }
  
  
  
  

你可能感兴趣的:(ACM,pku)