1. 程式人生 > >International Collegiate Routing Contest

International Collegiate Routing Contest

-0-馬上上計網了,感覺沒什麼空再看笛卡爾樹了2333來水篇部落格
還一個多禮拜就要去西安當分母了。第一次當分母內心還有點小緊張2333
然後我們來看看這個強行銀牌題。。
隊友還是強啊,五分鐘把銅牌題公式甩我臉上了然鵝QWQ
這個銀牌題其實也不是很難(如果看得懂題的話)
首先把所有ip換成二進位制表示,題目表示如果有效字首相同那麼他們在一個子網內。
那麼怎麼才算有效字首呢。看/後面那個數字,就是從高到低這個字數位是有效位
255.255.255.255/32為例
11111111.11111111.11111111.11111111有效字首是32位就是全部有效
那麼這個子網就只有一個ip就是255.255.255.255
如果是255.255.255.255/24那就只有24位了
所以畫一畫的話就會發現我們255.255.255.~這個~可以從0-255都是在這個子網內的
如果把上面/24換成23
可以發現111111111.11111111.1111111有效字首是這些
那麼之後的11111111.11111111.11111110.~和11111111.11111111.11111111.~
都在這個子網的支配下,那麼我們很容易想到用字典樹去匹配字首。
那麼我們的目的是至少還要多少才能支配剩下的子網且不能有衝突
現在我們在字典樹上看,把ip表示為a.b.c.d/e
支配這個行為其實就是在字典樹a.b.c.d這條鏈上找到高度為e的那個點
以這個點為根節點的所有網路都被這個子網支配
有鏈就說明以當前這個字首為子網的話下面還有已存在的子網,會產生衝突
那麼我們不產生衝突的話就要找到當前網路不存在的子網
也就是在字典樹上找到還沒有建的節點,那麼就可以直接遍歷整棵字典樹
如果碰到沒有建的節點,那麼說明這個節點可以支配一個不會產生衝突的子網
這是我們需要的
如果碰到一個節點是有效字首的末尾,那麼這之後的所有子網都被這個字首支配所以不需要新增子網
最後輸出就行了2333

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6 + 8;

struct Tire
{
    int mark;
    int next[2];
}t[N];
struct IP
{
    int ip[40];
};
int tot = 0;
int x[40];
int root;

int NewNode()
{
    tot ++;
    t[tot].mark = 0;
    for(int i = 0;i<2;i++)
        t[tot].next[i] = 0;
    return
tot; } void init() { memset(t,0,sizeof(t)); tot = 0; root = NewNode(); } void ip2str(int a,int b,int c,int d,int e) { memset(x,0,sizeof(x)); for(int i = 7;i>=0;i--) { x[i] = a % 2; a /= 2; } for(int i = 15;i >= 8;i--) { x[i] = b % 2; b /= 2
; } for(int i = 23;i >= 16;i--) { x[i] = c % 2; c /= 2; } for(int i = 31;i >= 24;i--) { x[i] = d % 2; d /= 2; } x[32] = e; } void insert() { int pos = x[32]; int r = root; for(int i = 0;i<32;i++) { if(!pos) { t[r].mark = 1; return; } //printf("%d %d %d\n",i, x[i],r); if(!t[r].next[x[i]]) { int temp = NewNode(); t[r].next[x[i]] = temp; } r = t[r].next[x[i]]; pos --; } } vector<IP>ans; int tar[40]; void dfs(int r,int d) { if(d > 32) return; if(!r) { IP temp; for(int i = 0;i<33;i++) temp.ip[i] = tar[i]; temp.ip[32] = d; ans.push_back(temp); return; } if(t[r].mark) return; tar[d] = 0; dfs(t[r].next[0],d+1); tar[d] = 1; dfs(t[r].next[1],d+1); tar[d] = 0; } void PrintIp(IP x) { int a,b,c,d,e; a = b = c = d = e = 0; for(int i = 0;i<8;i++) { a *= 2; a += x.ip[i]; } for(int i = 8;i<16;i++) { b *= 2; b += x.ip[i]; } for(int i = 16;i<24;i++) { c *= 2; c += x.ip[i]; } for(int i = 24;i<32;i++) { d *= 2; d += x.ip[i]; } e = x.ip[32]; printf("%d.%d.%d.%d/%d\n",a,b,c,d,e); } int main() { int T; scanf("%d",&T); int ka = 0; while(T--) { int n; scanf("%d",&n); init(); for(int i = 0;i<n;i++) { int a,b,c,d,e; scanf("%d.%d.%d.%d/%d",&a,&b,&c,&d,&e); ip2str(a,b,c,d,e); insert(); } ans.clear(); memset(tar,0,sizeof(tar)); dfs(root,0); printf("Case #%d:\n",++ka); if(n == 0) { printf("1\n"); printf("0.0.0.0/0\n"); continue; } printf("%d\n",ans.size()); for(int i = 0; i != ans.size(); i ++) PrintIp(ans[i]); } }

相關推薦

Gym - 100548I International Collegiate Routing Contest 字典樹

Description You may know thatBluegao University (formly Bluefly University) is famous ofnetworking technology. One day, their headmaster Yuege recei

Gym - 100548I International Collegiate Routing Contest (01字典樹)

  題意:給你多個子網掩碼,要你求一個最小的子網掩碼補集。   解題思路:IPV4一共有 2^32個地址,實際上對應的就是一個完全字典樹。現在給定的子網掩碼,實際上就是給定了一個字典樹,然後要你求這個字典樹的補樹,使得是一個完全字典樹。實際上就是求這個字典樹

100548I International Collegiate Routing Contest (01字典樹)

題意:給你多個子網掩碼,要你求一個最小的子網掩碼補集。 解題思路:IPV4一共有 2^32個地址,實際上對應的就是一個完全字典樹。現在給定的子網掩碼,實際上就是給定了一個字典樹,然後要你求這個字典樹的補樹,使得是一個完全字典樹。實際上就是求這個字典樹的所有補樹形

International Collegiate Routing Contest

-0-馬上上計網了,感覺沒什麼空再看笛卡爾樹了2333來水篇部落格 還一個多禮拜就要去西安當分母了。第一次當分母內心還有點小緊張2333 然後我們來看看這個強行銀牌題。。 隊友還是強啊,五分鐘把銅牌題公式甩我臉上了然鵝QWQ 這個銀牌題其實也不是很難(如

2014 西安站 I International Collegiate Routing Contest(trie)

題目連結:這裡 題意:輸入IPv4地址空間中的一些子網號,構成一個網路集合。 輸出最小的一個網路集合,要求其與輸入集合沒有交集,且相對IPv4地址空間全集,是輸入集合的補集。輸出集合包含的子網號,格式遵循網路規範 做法:tire樹,把所有輸入的子網插入tr

ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

and con account stones over ont int ble style ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (

ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)

debug -a struct 人性 pro ati 銀河 ans n) ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018) B. New

GYM-ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)

GYM 兩星級難度還是比較簡單,隨便寫個題解吧。 http://codeforces.com/gym/101853 A - Zero Array  沒啥好講的的,離散化一下就隨便寫。 #include<bits/stdc++.h> #define lson rt

Problem I. International Collegiate Routing ContestGym

題目意思是,說給予n個32位IP地址,每個地址的後面有一個K,每個K代表與當前所給的IP地址的前K位相同的話,就為同一IP地址,然後問你,最少再補充多少的IP地址使得能構成所有的IP地址。  思路:字典樹的題目,對於每個32位的串,輸入字典樹中,如果當前K小於32那麼就只匯

【離散化樹狀數組】Nordic Collegiate Programming Contest G.Galactic Collegiate Programming Contest

sizeof add urn ont col down += str one 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int n,m; 5

The 2018 ACM-ICPC Chinese Collegiate Programming Contest Take Your Seat

scanf com 分享圖片 pro name string 技術 證明 double /* 證明過程如下 :第一種情況:按1到n的順序上飛機,1會隨意選一個,剩下的上去時若與自己序號相同的座位空就坐下去,若被占了就也會隨意選一個。求最後一個人坐在應坐位置的概率 *

German Collegiate Programming Contest 2018? A. Attack on Alpha-Zet

順序 技術分享 a-z contest 路徑 print bfs class roo 題目鏈接https://nanti.jisuanke.com/t/28852 題目大意是 h*w 的平面,每兩個點有且僅有一條路徑,類似於封閉的聯通空間,然後在這h*w個點中選取(標記

Nordic Collegiate Programming Contest 2015? G. Goblin Garden Guards

輸入 href html sin con seve nod desc title In an unprecedented turn of events, goblins recently launched an invasion against the Nedewsian

The 15th Zhejiang Provincial Collegiate Programming Contest(部分題解)

begin iter 一個數 ons opera cst style string += ZOJ 4024 Peak 題意 給出n和n個數,判斷該數列是否是凸形的。 解題思路 從前往後第一對逆序數,和從後往前第一隊逆序數,如果都非零而且相鄰,證明該數組是凸形的。 代碼

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians DP

題目連結:https://codeforc.es/gym/101933/problem/A 題意:有 n 只青蛙在一個坑裡面,要求可以跳出坑的青蛙的最大數量。每個青蛙有 3 種屬性:l 為青蛙一次可以跳的高度,w 為青蛙的重量,h 為青蛙作為墊背時的高度,墊背的前提是墊背的青蛙的重量比在他上面的青蛙的總重量

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) D. Delivery Delays 二分+最短路+DP

題目連結:https://codeforc.es/gym/101933/problem/D 題意:地圖上有 n 個位置和 m 條邊,每條邊連線 u、v 且有一個距離 w,一共有 k 個詢問,每個詢問表示 ti 時間在位置 ui 有人下單點了披薩,而披薩店在 di 時間做好披薩可以送出去,披薩店在位置 1,送

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

傳送門 A.Altruistic Amphibians     一個挺有意思的題目。首先考慮這樣的問題:倘若要讓儘可能多的青蛙能夠逃跑,則顯然羅漢最好疊得儘可能的高(這才能使得那些不能一次性跳出的青蛙能夠逃離)。     而顯然,對於那些體重最

A - Multiplication Dilemma (思維)( 2018 ACM ICPC Arabella Collegiate Programming Contest

滴答滴答---題目連結  Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your mind, but it is eas

Gym - 101808E Floods ACM ICPC, Damascus University Collegiate Programming Contest(2018)-E

傳送門:http://codeforces.com/gym/101808/problem/E E-Floods You probably heard and even saw the heavy rains that flooded the streets of Damascus rec

2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (線段樹+GCD)

clu 假設 -- air ref make code i++ art 題目鏈接:https://codeforces.com/gym/101991/problem/G 題意:給出 n 個數,q 次詢問區間[ li,ri ]之間有多少個 GCD = di 的連續子區間。 題