一开始看的时候就想歪了,比赛的时候一直在YY线段树区间覆盖,然后纠结节点数太多开不下怎么办啊啊啊啊……

然后昨天吃饭的时候也在纠结这到底是个啥题,后来发现公共前缀->前缀??!!!!->这不是很显然的Trie么……QAQ

举例说明:

对于subnet: 123.45.4.0/22,转化成二进制后,取前22位(长度由子网掩码决定)加入Trie树,后面的IP一定是0所以无意义,然后每个节点开一个vector保存能到达这个节点的所有子网的Pid,以及该子网IP的最大值。

对于ip_src:查找它所属于的所有子网组的Pid,并标记出来。

对于ip_dst:看它与ip_src所属的所有子网组的Pid跟之前标记出来的是否有相同的,如果有,就证明他俩在同一个子网组中。

PS.昨天晚上在杭电交一直RERERERE,改到大半夜……今天早上又看了一遍还是觉得代码没错,原样交上竟然A了……杭电你还我青春啊啊啊!!!

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm> #define LL long long int using namespace std; const int MAXN = ; struct IP
{
int id;
LL num;
IP( int id, LL num ): id(id), num(num) { }
}; struct node
{
node *next[];
vector<IP> R;
node()
{
next[] = next[] = NULL;
R.clear();
}
}; node *root;
bool ok[MAXN];
int ans[MAXN];
int cas; void Insert( int mask, LL ip, int id )
{
node *p = root;
for ( int i = ; i < mask; ++i )
{
int id = ( ( ip >> ( - i) ) & ) == ? : ;
if ( p->next[id] == NULL )
{
p->next[id] = new node;
}
p = p->next[id];
}
p->R.push_back( IP( id, ip ) );
return;
} LL ReadIP()
{
int a, b, c, d;
scanf( "%d.%d.%d.%d", &a, &b, &c, &d );
LL res = ;
res |= (LL)a, res <<= ;
res |= (LL)b, res <<= ;
res |= (LL)c, res <<= ;
res |= d;
return res;
} void FindSRC( LL ip )
{
node *p = root;
for ( int i = ; i < ; ++i )
{
int id = ( ( ip >> ( - i) ) & ) == ? : ;
int sz = p->R.size();
for ( int j = ; j < sz; ++j )
{
if ( ok[ p->R[j].id ] && ( ip&( ( (1LL << (-i)) - )) ) <= p->R[j].num )
ans[ p->R[j].id ] = cas;
}
if ( p->next[id] == NULL ) return;
p = p->next[id];
}
return;
} bool FindDST( LL ip )
{
node *p = root;
for ( int i = ; i < ; ++i )
{
int id = ( ( ip >> ( - i) ) & ) == ? : ;
int sz = p->R.size();
for ( int j = ; j < sz; ++j )
{
if ( ok[ p->R[j].id ] && (ip&( ( (1LL << (-i)) - )) ) <= p->R[j].num )
{
if ( ans[ p->R[j].id ] == cas )
return true;
}
}
if ( p->next[id] == NULL ) return false;
p = p->next[id];
}
return false;
} int main()
{
//freopen( "in.txt", "r", stdin );
//freopen( "out.txt", "w", stdout );
char op[];
root = new node;
memset( ok, false, sizeof(ok) );
cas = ;
while ( scanf( "%s", op ) == )
{
if ( op[] == 'E' )
{
int id;
scanf( "%d", &id );
ok[id] = true; int n;
scanf( "%d", &n );
for ( int i = ; i < n; ++i )
{
int mask;
LL ip = ReadIP();
scanf( "/%d", &mask );
ip += ( 1LL << ( - mask) ) - ;
Insert( mask, ip, id );
}
}
else if ( op[] == 'D' )
{
int id;
scanf( "%d", &id );
ok[id] = false;
}
else
{
++cas;
LL IPsrc = ReadIP();
FindSRC( IPsrc );
LL IPdst = ReadIP();
if ( FindDST( IPdst ) ) puts("F");
else puts("D");
}
}
return ;
}

HDU 4760 Good Firewall ( Trie树 )的更多相关文章

  1. HDU 4757 可持久化trie树

    首先如果给定一些数,询问这些数中哪个数^给定的数的值最大的话,我们可以建立一颗trie树,根连接的两条边分别为0,1,表示二进制下第15位,那么我们可以建立一颗trie树,每一条从根到叶子节点的链表示 ...

  2. HDU - 1251 统计难题(trie树)

    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).  Input输入数据的第一部 ...

  3. HDU 4760 Good FireWall 完好Trie题解

    本题乍看像是线段树之类的区间操作,只是由于仅仅是须要查找ip的前缀,故此事实上是使用Trie来做. 挺高难度的Trie应用,做完这道题之后说明Trie功力有一定火候了. 这里的Trie使用到了Dele ...

  4. hdu 1671 Phone List (Trie树)

    简单的字典树应用,在建树的时候判断就行了. 需要注意的语法: 在使用malloc和free来处理动态内存的时候,仅仅是释放了这个对象所占的内存,而不会调用这个对象的析构函数:使用new和delete就 ...

  5. HDU 5384 Danganronpa (Trie树)

    题意:给出两个集合S和T,集合中每个元素是个字符串,而T集合中任一元素都是个子弹,可以打S中的任一怪物,如果子弹是怪物的子串,那么才有伤害值1,若在怪物中出现多次,次数为该子弹打到该怪物的伤害值.每个 ...

  6. hdu 4825 Xor Sum trie树

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Proble ...

  7. hdu 5687 Problem C trie树

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Prob ...

  8. hdu 1671&& poj 3630 (trie 树应用)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25280   Accepted: 7678 Descr ...

  9. hdu 1251 统计难题(trie树入门)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

随机推荐

  1. android ndk中使用gprof

    1.下载gprof支持库 下载地址: http://code.google.com/p/android-ndk-profiler/ 2.代码上的修改添加 在初始化时: monstartup(" ...

  2. js 实现序列号效果实现

    前端的朋友可能遇到过这样的需求,要求在页面输入一串序列号,或激活码(就像在PC正版软件中的序列号),可是HTML中并没有为我们提供类似的组件,我们来自己实现一个: 大体的思路是在表单里有一个隐藏的in ...

  3. rest_framwork组件

    rest framework介绍 (CBV(class base views)) 在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删.改.查的实现流程基本套路化,所以这部分代码也 ...

  4. Java - 关于基础数据类型的形参和返回值

    1. 当基础数据类型被当作形参时,最好使用其包装类,因为这样可方便调用者传参(基础数据类型亦或是其包装类都可)   2. 当基础数据类型被当作返回值时,最好使用原型,因为这样可以方便调用者接收返回值( ...

  5. 使用PHP生成分享图片

    小程序导航 wq.xmaht.top 假设代码中用到的资源文件夹在当前code_png目录下: /** * 分享图片生成 * @param $gData 商品数据,array * @param $co ...

  6. python学习之字符串转换

    配置环境:python 3.6   python编辑器:pycharm 代码如下: #!/usr/bin/env python #-*- coding: utf-8 -*- def strCase() ...

  7. PAT Basic 1057

    1057 数零壹 给定一串长度不超过 10​5​​ 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有 ...

  8. C# 中的正则简单例子

    public static void Main() { Regex rgx = new Regex(@"[S|s]et-[C|c]ookie: (?<cookieName>\w+ ...

  9. Json的用处一

    今天,我们用到了json的的用处,其实也就是一个很简单的用处,就是点击一个按钮,触发一个事件,然后调用json, 之后我们就可以进行异步操作,其实只是针对于后台的操作,其实我们并没有对数据库进行刷新, ...

  10. Maven系列之快速入门

    文章结构 唯快不破---Maven快速入门 稳打稳扎---Maven核心知识 实用为先---Maven如何建立Web项目  1   唯快不破---Maven快速入门       1.1 Maven项目 ...