1. 程式人生 > >loj2046 「CQOI2016」路由表

loj2046 「CQOI2016」路由表

name AI class pre struct tdi names || std

大傻逼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」路由表