Problem I. International Collegiate Routing ContestGym
来源:互联网 发布:js new对象删除 编辑:程序博客网 时间:2024/06/06 18:11
题目意思是,说给予n个32位IP地址,每个地址的后面有一个K,每个K代表与当前所给的IP地址的前K位相同的话,就为同一IP地址,然后问你,最少再补充多少的IP地址使得能构成所有的IP地址。
思路:字典树的题目,对于每个32位的串,输入字典树中,如果当前K小于32那么就只导入到第K位,然后在当前节点做标记,建完树后,跑一遍DFS就可以了。
#include <iostream>#include <stdio.h>#include <algorithm>#include <cstring>#include <queue>using namespace std;#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct node{ int next[2]; int v; void init(){ v=0; memset(next,-1,sizeof(next)); }};struct node L[4000000];int tot=0;void add(char a[],int len, int x){ int now=0; for(int i=0;i<len;i++){ int tmp=a[i]-'0'; int next=L[now].next[tmp]; if (i + 1 == x) { L[now].next[tmp] = -2; return; } if (next == -2) { return; } if(next==-1){ next=++tot; L[next].v=-1; L[next].init(); L[now].next[tmp]=next; } now=next; L[now].v++; }}int T, n;int a,b,c,d,k;char s[50];int becom_cha(int x, int len){int l = len;int r = len;for (int i = 0; i < 7; i++) {s[r++] = x%2 + '0';x = x/2;}s[r++] = x+'0';reverse(s+l, s+r);return r;}struct point{long long int x, y;point (long long int a = 0, long long int b = 0) {x = a;y = b;}};int a1[100];vector<point> q;void dfs(int now, long long int x, int len){if (len == 32) return;for (int i = 0; i < 2; i++) {if (L[now].next[i] == -2) continue;else if (L[now].next[i] == -1) {long long int ans = 2*x+i;for (int j = len+1; j < 32; j++) {ans = 2 * ans;}q.push_back(point(ans, len+1));}else dfs(L[now].next[i], x*2+i, len+1);}return;}int main(){scanf("%d", &T);int cas = 0;while (T--) {cas++;scanf("%d", &n);tot = 0;L[tot].init();if (n == 0) {printf("Case #%d:\n1\n0.0.0.0/0\n", cas);continue;}for (int i = 1; i <= n; i++) {int len = 0;scanf("%d.%d.%d.%d", &a, &b, &c, &d);char ch=getchar();if(ch=='/')scanf("%d",&k);else k=0;len = becom_cha(a, len);len = becom_cha(b, len);len = becom_cha(c, len);len = becom_cha(d, len);add(s, len, k);}q.clear();dfs(0, 0, 0);printf("Case #%d:\n", cas);if(k==0){printf("0\n");continue;}printf("%d\n",q.size());for (int i = 0; i < q.size(); i++) {long long int ans = q[i].x;for (int j = 0; j < 3; j++) {a1[j] = ans%256;ans /= 256;}a1[3] = ans;for (int j = 3; j >= 0; j--) {printf("%d%c", a1[j],j==0?'/':'.');}printf("%lld\n", q[i].y);}}}
阅读全文
0 0
- Problem I. International Collegiate Routing ContestGym
- 西安现场赛 Problem I. International Collegiate Routing Contest
- CF GYM 100548 International Collegiate Routing Contest(2014ACM西安现场赛Problem I)
- 2014 西安站 I International Collegiate Routing Contest(trie)
- CF GYM 100548 International Collegiate Routing Contest(2014ACM西安现场赛Problem I)不懂提
- Codeforces GYM 100548 I - International Collegiate Routing Contest 2014 ACM Xian Regional Contest
- 2014西安现场赛I题 International Collegiate Routing Contest(字典树)
- 2014 ACM/ICPC Xi'an Regional I - International Collegiate Routing Contest
- UVALive 7043 International Collegiate Routing Contest(字典树)
- UVALive 7043 International Collegiate Routing Contest 字典树
- UVALive 7043 International Collegiate Routing Contest(字典树)
- UVALive 7043 International Collegiate Routing Contest 字典树,递归
- ACM International Collegiate Programming H.动态规划
- 6th Jilin Province Collegiate Programming Contest——Problem I: Crossword
- The 6th Zhejiang Provincial Collegiate Programming Contest->Problem I:A Stack or A Queue?
- The 6th Zhejiang Provincial Collegiate Programming Contest->Problem I:A Stack or A Queue?
- The 31st ACM International Collegiate Programming Contest World Finals
- 2009 ACM International Collegiate Programming Contest Winners Announced
- typdef与define的区别
- 《第一行代码 Android 第2版》学习记录
- 关于新词发现
- oracle 用户被锁定解锁方法
- Tornado框架01-高性能简介
- Problem I. International Collegiate Routing ContestGym
- HTML5语义化标签综合基础案例
- scala(1:函数式编程新)
- Arduino学习之一——软硬件准备
- 一本有关方法论的好书---《硅谷之谜》读后感
- Test 2017.10.16
- Rust日志学习(二)——env_logger
- Tornado框架02-创建服务器与多进程
- 网易2018校园招聘编程题真题-[编程题] 交错01串