【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
原创粉丝点击