【HDU 4760】Good Firewall(Trie水题)
来源:互联网 发布:方正小标宋简体 mac 编辑:程序博客网 时间:2024/05/17 23:17
计算机网络没学好,比赛的时候脑子一抽题意理解错了,赛后自己写了1A,内流满面。。。。
和一般的trie不太一样,这里的trie每个节点开一个vector存网络的id
恩,就这样,跑的挺快的 78ms
#include<map>#include<set>#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<algorithm>#define LL long longusing namespace std;//-------------------------------------char op[5];int num_ip[1050] = {0};int temp_ip[50];int find_ip[50];int ip[1050][16][50];int cnt;//-------------------------------------void debug(int id,int t){ for(int i = 0; i < 32; i++) printf("%d",ip[id][t][i]); puts("");}void dfs(int n){ if(n == 0) return; temp_ip[cnt++] = n % 2; dfs(n / 2);}//--------------Trie--------------------const int maxn = 800005;struct Trie{ int ch[maxn][2]; int cnt; vector<int>vis[maxn]; int have[1050]; void init(){ cnt = 1; memset(ch[0],0,sizeof(ch[0])); } void newNode(){ memset(ch[cnt],0,sizeof(ch[cnt])); vis[cnt].clear(); cnt ++; } void insert(int id,int addr[],int num){ int u = 0; for(int i = 0; i < num; i++){ if(!ch[u][addr[i]]){ ch[u][addr[i]] = cnt; newNode(); } u = ch[u][addr[i]]; } //printf("%d\n",u); vis[u].push_back(id); } int find(int op,int addr[]){ int u = 0; if(!op) memset(have,0,sizeof(have)); for(int i = 0; i < 32; i++){ if(!ch[u][addr[i]]) return - 1; u = ch[u][addr[i]]; //printf("%d\n",u); if(vis[u].size() != 0){ int Size = vis[u].size(); for(int j = 0; j < Size; j++){ if(!op){ //printf("%d\n",vis[u][j]); have[vis[u][j]] = 1; } else if(have[vis[u][j]] && num_ip[vis[u][j]]){ //printf("%d\n",vis[u][j]); return 1; } } } } return -1; }}trie;int main(){ trie.init(); int id,num; int p[5]; int ip_num; while(scanf("%s",op) != EOF){ if(op[0] == 'E'){ scanf("%d",&id); scanf("%d",&num_ip[id]); for(int i = 0; i < num_ip[id]; i++){ scanf("%d.%d.%d.%d/%d",&p[0],&p[1],&p[2],&p[3],&p[4]); ip_num = 0; for(int j = 0; j < 4; j++){ cnt = 0; dfs(p[j]); for(int k = cnt; k < 8; k++) ip[id][i][ip_num++] = 0; for(int k = cnt - 1; k >= 0; k--) ip[id][i][ip_num++] = temp_ip[k]; } trie.insert(id,ip[id][i],p[4]); } } else if(op[0] == 'F'){ int t[2]; for(int i = 0; i < 2; i++){ scanf("%d.%d.%d.%d",&p[0],&p[1],&p[2],&p[3]); ip_num = 0; for(int j = 0; j < 4; j++){ cnt = 0; dfs(p[j]); for(int k = cnt; k < 8; k++) find_ip[ip_num++] = 0; for(int k = cnt - 1; k >= 0; k--) find_ip[ip_num++] = temp_ip[k]; } //for(int j = 0; j < 32; j++) printf("%d",find_ip[j]); puts(""); t[i] = trie.find(i,find_ip); } if(t[1] == 1) puts("F"); else puts("D"); } else{ int v; scanf("%d",&v); num_ip[v] = 0; } //printf("%d\n",trie.cnt); } return 0;}/*E 1 2 123.45.4.0/22 123.45.6.78/22*/
0 0
- 【HDU 4760】Good Firewall(Trie水题)
- HDU 4760 Good Firewall (Trie)
- hdu 4760 - Good Firewall(Trie)
- HDU 4760 Good FireWall 完善Trie题解
- hdu 4760 Good Firewall(字典树)
- hdu4760Good Firewall(Trie树)
- Good Firewall(字典树 HDU4760)
- CF 271D Good Substrings(trie树)
- HDU 2846 Repository (Trie)
- hdu 1251 (Trie 树)
- hdu 4416 Good Article Good sentence (后缀自动机 SAM)
- HDU 4416 Good Article Good sentence(后缀数组)
- Good Article Good sentence Hdu
- HDU Good Numbers (热身赛2)
- HDU 4722 Good Numbers (数位dp)
- hdu 5447 Good Numbers(数论)
- hdu 4722 Good numbers(数位DP)
- hdu 4722 Good Numbers(规律题)
- Advanced Fruits(HDU1503)LCS
- swap清内存
- acm 输入输出外挂
- 19个必须知道的Visual Studio快捷键
- HDOJ--1503 Advanced Fruits
- 【HDU 4760】Good Firewall(Trie水题)
- Hibernate学习——之延迟加载
- IO基础入门之I/O多路复用技术
- 计算机网络--TCP协议中的三次握手和四次挥手(图解)
- 算法——贝叶斯
- BZOJ 2752 [HAOI2012]高速公路(road) 线段树
- UVA 1225 Digit Counting
- [c语言]冒泡排序-------对折判断法
- BLHeli