2019ICPC上海站
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; }
K Color Graph
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 int t, n, m; 5 int u[205], v[205]; 6 int vis[20]; 7 int ans; 8 9 void dfs(int x) { 10 if (x == n) { 11 int cnt = 0; 12 for (int i = 1; i <= m; i++) 13 cnt += (vis[u[i]] ^ vis[v[i]]); 14 ans = max(ans, cnt); 15 return; 16 } 17 18 vis[x] = 1; 19 dfs(x + 1); 20 vis[x] = 0; 21 22 dfs(x + 1); 23 } 24 25 int main() { 26 //freopen("in", "r", stdin); 27 ios::sync_with_stdio(0); 28 cin >> t; 29 for (int j = 1; j <= t; j++) { 30 cin >> n >> m; 31 ans = 0; 32 for (int i = 1; i <= m; i++) 33 cin >> u[i] >> v[i]; 34 dfs(1); 35 cout << "Case #" << j << ": " << ans << endl; 36 } 37 return 0; 38 }