标签:
计算机网络没学好,比赛的时候脑子一抽题意理解错了,赛后自己写了1A,内流满面。。。。
和一般的trie不太一样,这里的trie每个节点开一个vector存网络的id
恩,就这样,跑的挺快的 78ms
#include<map> #include<set> #include<cmath> #include<cstdio> #include<vector> #include<cstring> #include<algorithm> #define LL long long using 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 */
版权声明:本文为博主原创文章,未经博主允许不得转载。
【HDU 4760】Good Firewall(Trie水题)
标签:
原文地址:http://blog.csdn.net/u013451221/article/details/47404169