题目意思是,说给予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);
}
}
}