https://ac.nowcoder.com/acm/contest/4370
B题
判断是不是前缀编码T组样例,N个字符串,判断有没有一个是另一个的前缀
Trie
标记这个节点的编号是否出现过两次
注意,一定要有ed,比如说第二组测试样例,如果没有ed,5,59此时5已经走过了
#include <bits/stdc++.h> using namespace std; const int maxn = 10005 * 10; string str; int t,n; int flag; int trie[maxn][26],id = 1,vis[maxn],ed[maxn]; void insert(string s) { int p = 1; for(int i = 0; i < s.size(); i++) { int ch = s[i] - '0'; if (trie[p][ch]== -1) trie[p][ch] = ++id; p = trie[p][ch]; if(ed[p]) flag = 0; vis[p]++; } if(vis[p] > 1) flag = 0; ed[p]++; } int main(){ //freopen("in","r",stdin); ios::sync_with_stdio(0); cin >> t; for(int i = 1; i <= t;i++){ cout << "Case #" << i << ": "; cin >> n; flag = 1; memset(vis,0, sizeof(vis)); memset(ed,0, sizeof(ed)); memset(trie,-1, sizeof(trie)); id = 1; for(int j = 1; j <= n; j++) { cin >> str; insert(str); } if(flag) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }