题意:给出一些数字串,判断是否有一个数字串是另一个串的前缀。
这题真的可以算是Trie树的一道模板题了。
先把Trie树建好,建树的时候记录一个sum表示一个节点有多少个串会包含此节点,然后再记录一个end表示这个节点是不是一个串的结尾。
然后dfs/bfs遍历整个Trie树若一个节点x满足end[x]=true && sum[x]>=2则题目条件成立。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; string s; int trie[1000][2]; int tot, sum[1000]; bool ennd[1000], ans; void insert(string t) { int p = 1; for (int i = 0; i < (int)t.length(); i++) { int k = t[i] - '0'; sum[p]++; if (!trie[p][k]) trie[p][k] = ++tot; p = trie[p][k]; } sum[p]++; ennd[p] = 1; } void dfs(int x) { if (ennd[x] && sum[x] >= 2) ans = 1; if (trie[x][0]) { dfs(trie[x][0]); } if (trie[x][1]) { dfs(trie[x][1]); } } int case_num; int main() { while (cin >> s) { case_num++; if (s[0] == '9') continue; ans = 0; tot = 1; memset(ennd, 0, sizeof(ennd)); memset(sum, 0, sizeof(sum)); memset(trie, 0, sizeof(trie)); insert(s); while (cin >> s) { if (s[0] == '9') break; insert(s); } dfs(1); if (ans) printf("Set %d is not immediately decodable ", case_num); else printf("Set %d is immediately decodable ", case_num); } return 0; }