码迷,mamicode.com
首页 > 其他好文 > 详细

loj2046 「CQOI2016」路由表

时间:2018-04-26 23:26:33      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:mes   pac   路由表   题解   ++   print   ==   --   bool   

大傻逼trie树,更傻逼的是我这都没独立想出来,以后要少看题解,多多思考

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int m, cnt, s[20000005][2], now, orz[35], tag[20000005], faq;
char ss[15];
struct Node{
    int idx, dis;
}nd[35];
void rn(int &x){
    char ch=getchar();
    x = 0;
    while(ch<‘0‘ || ch>‘9‘) ch = getchar();
    while(ch>=‘0‘ && ch<=‘9‘){
        x = x * 10 + ch - ‘0‘;
        ch = getchar();
    }
}
void insert(){
    int uu, uv, uw, ux, uy;
    rn(uu); rn(uv); rn(uw); rn(ux); rn(uy);
    now++;
    for(int i=7; i>=0; i--)
        orz[24+i] = (uu>>i)&1;
    for(int i=7; i>=0; i--)
        orz[16+i] = (uv>>i)&1;
    for(int i=7; i>=0; i--)
        orz[8+i] = (uw>>i)&1;
    for(int i=7; i>=0; i--)
        orz[i] = (ux>>i)&1;
    int u=0;
    for(int i=31; 31-i+1<=uy; i--){
        if(!s[u][orz[i]])   s[u][orz[i]] = ++cnt;
        u = s[u][orz[i]];
    }
    tag[u] = now;
}
bool cmp(Node x, Node y){
    return x.idx<y.idx;
}
int query(){
    int uu, uv, uw, ux, uy, uz;
    rn(uu); rn(uv); rn(uw); rn(ux); rn(uy); rn(uz);
    for(int i=7; i>=0; i--)
        orz[24+i] = (uu>>i)&1;
    for(int i=7; i>=0; i--)
        orz[16+i] = (uv>>i)&1;
    for(int i=7; i>=0; i--)
        orz[8+i] = (uw>>i)&1;
    for(int i=7; i>=0; i--)
        orz[i] = (ux>>i)&1;
    faq = 0;
    int u=0;
    for(int i=31; i>=0; i--){
        if(!s[u][orz[i]])   break;
        u = s[u][orz[i]];
        if(tag[u])
            nd[++faq] = (Node){tag[u], 31-i+1};
    }
    sort(nd+1, nd+1+faq, cmp);
    int re=0, maxdis=0;
    for(int i=1; i<=faq; i++){
        if(nd[i].idx>=uy && nd[i].idx<=uz && (i==1 || nd[i].dis>maxdis))
            re++;
        maxdis = max(maxdis, nd[i].dis);
    }
    return re;
}
int main(){
    cin>>m;
    while(m--){
        scanf("%s", ss);
        if(ss[0]==‘A‘)  insert();
        else    printf("%d\n", query());
    }
    return 0;
}

loj2046 「CQOI2016」路由表

标签:mes   pac   路由表   题解   ++   print   ==   --   bool   

原文地址:https://www.cnblogs.com/poorpool/p/8955146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!