一开始看的时候就想歪了,比赛的时候一直在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. python2.7 加密模块 解决各种坑

    1 Python27 安装crypto Windows安装 在Windows上安装的时候直接 pip install pycrypto会报错,参考:http://blog.csdn.net/teloy ...

  2. arXiv 上传文章过程

      arXiv属于预印本服务的一种,是指科研工作者的研究成果还未在正式出版物上发表,而出于和同行交流目的自愿先在学术会议上或通过互联网发布的科研论文.科技报告等文章.与刊物发表的文章以及网页发布的文章 ...

  3. 带有data-ng-bind表达式

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. js中的变量提升(Hoisting)

    <script> function test(){ console.log(a); console.log(foo()); var a=1; function foo(){ return ...

  5. 键盘遮挡控件(textfield/textview.......)

    采用的是通知的常规方式 // 解决键盘遮挡问题//选择didShow是因为需要键盘的高度//选择willHide是因为视图frame重置需要优先于键盘消失,否则表现得不连贯 [[NSNotificat ...

  6. 洛谷P2759 奇怪的函数(log 二分)

    题目描述 使得 x^xxx 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^xxx 达到 n 位数字的最小正整数 x 输入输出样例 输 ...

  7. Linux帮助都有哪几种,如何使用?

    帮助文件有2类,内置命令和外部命令. 其中内置命令就是shell内核自带的,因为shell当中自己要进行管理,那么就需要一些命令进行管理,不同的shell肯定有不同的shell命令,我们用type命令 ...

  8. LeetCode969. 煎饼排序

    问题:969. 煎饼排序 给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序.我们要执行零次或多次煎饼翻转(按顺序一次接 ...

  9. python简介,数据类型,input,if语句

      1. python的起源 python的创始人为吉多·范罗苏姆(龟叔Guido van Rossum),1989年的圣诞节期间,龟叔为了在阿姆斯特丹打发时间 决心开发一个新的脚本程序解释器,作为A ...

  10. php 操作 mysql 实现批量执行mysql语句 mysql文件

    <?php /** * 批量运行sql文件 * 正则分隔是重点 preg_split("/;[\r\n]+/", filecontent) */ $config = requ ...