[题目大意]
给你n个128位二进制IP地址,输出压缩后的最短的IP地址,如果长度相同,输出字典序最小的那一个。
压缩规则:每16位二进制数为一个域,例如0000000110001111为一个域(压缩后相邻两个域之间用 “:” 分隔开),然后将四位二进制数转换成一位16进制数,如0000000110001111变成01af,其中每个域前导的0要去掉,如果这个域值为0,则用零表示。然后连续两个域以上的值都为零,则用两个冒号“::”表示,“::”在一个ip地址中最多只能用一次。
(眼花缭乱!!!!!!!!!!!!!)
[样例输入]
8
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000010010001101000101011001111000100110101011000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000010010001100000000000000000000000000000000000000000000000001000101011001111000100110101011
11111111111111111111111111110000000000000000000000000000000000000000000000001111000000000000000000000000000000000000000000000000
00010001000100010001000100010000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000
00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001
00000001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001
00010001000100010001000100010001000100000001000100010001000100010001000100010001000100010001000100010001000100010001000100010001
[样例输出]
Case #1: ::
Case #2: 0:0:123:4567:89ab::
Case #3: 0:0:123::4567:89ab
Case #4: ffff:fff0:0:0:f::
Case #5: 1111:1110:0:0:1::
Case #6: 1111:1111:1111:1111:1111:1111:1111:1111
Case #7: 111:1111:1111:1111:1111:1111:1111:1111
Case #8: 1111:1111:1011:1111:1111:1111:1111:1111
[代码]
1 #include <bits/stdc++.h> 2 #define ll long long 3 #define pai pair<int,int> 4 using namespace std; 5 int bit[4]= {8,4,2,1};//8421码表 6 map<int,string>MAP; 7 bool comp(string &a,string &b) 8 { 9 int len1=a.length(),len2=b.length(); 10 if(len1==len2)return a<b; 11 return len1<len2; 12 } 13 void init() 14 { 15 MAP[0]="0"; 16 MAP[1]="1"; 17 MAP[2]="2"; 18 MAP[3]="3"; 19 MAP[4]="4"; 20 MAP[5]="5"; 21 MAP[6]="6"; 22 MAP[7]="7"; 23 MAP[8]="8"; 24 MAP[9]="9"; 25 MAP[10]="a"; 26 MAP[11]="b"; 27 MAP[12]="c"; 28 MAP[13]="d"; 29 MAP[14]="e"; 30 MAP[15]="f"; 31 } 32 int main() 33 { 34 // cout<<int(':')<<" "<<int('a')<<" "<<int('0')<<endl; 35 // string a="::ffff:ffff:0:0:0"; 36 // string b="0:0:0:ffff:ffff::"; 37 // string c="0:0:0:1111:1111::"; 38 // string d="::1111:1111:0:0:0"; 39 // if(a>b)cout<<"a>b"<<endl; 40 // else if(a==b)cout<<"a=b"<<endl; 41 // else cout<<"b>a"<<endl; 42 // if(c>d)cout<<"c>d"<<endl; 43 // else if(c==d)cout<<"c=d"<<endl; 44 // else cout<<"d>c"<<endl; 45 init(); 46 int t; 47 scanf("%d",&t); 48 int k=1; 49 while(k<=t) 50 { 51 queue<pai>que; 52 string ans[10]; 53 int l=0,r=0; 54 int maxx=0; 55 getchar(); 56 for(int i=1; i<=8; i++) 57 { 58 char add[20]; 59 scanf("%16s",add); 60 int now=0; 61 int num=0; 62 bool flag=false; 63 for(int j=0; j<16; j++) 64 { 65 now=now+bit[j%4]*(add[j]-'0'); 66 // cout<<j<<" "<<now<<endl; 67 if(now>0)flag=true; 68 if(j%4==3) 69 { 70 num=num*10+now; 71 if(flag) 72 ans[i]+=MAP[now]; 73 now=0; 74 } 75 } 76 if(num==0) 77 { 78 ans[i]="0"; 79 } 80 } 81 int bitnum=0; 82 for(int i=1; i<=8; i++) 83 { 84 if(ans[i].compare("0")==0) 85 { 86 bitnum++; 87 } 88 else bitnum=0; 89 if(bitnum>=2) 90 { 91 if(maxx<=bitnum) 92 { 93 l=i-bitnum+1; 94 r=i; 95 que.push(pai(l,r)); 96 maxx=bitnum; 97 } 98 } 99 } 100 printf("Case #%d: ",k); 101 if(que.size()==0) 102 { 103 for(int i=1; i<=8; i++) 104 { 105 cout<<ans[i]; 106 if(i<8)printf(":"); 107 } 108 printf(" "); 109 } 110 else 111 { 112 string out[1000]; 113 int ans_num=0; 114 while(!que.empty()) 115 { 116 pai p=que.front(); 117 que.pop(); 118 int _l=p.first,_r=p.second; 119 for(int i=1; i<=8;) 120 { 121 if(i==_l) 122 { 123 out[ans_num]+="::"; 124 i=_r+1; 125 } 126 else 127 { 128 out[ans_num]+=ans[i]; 129 if(i<8&&i+1!=_l) 130 out[ans_num]+=":"; 131 i++; 132 } 133 } 134 ans_num++; 135 } 136 sort(out,out+ans_num,comp); 137 cout<<out[0]<<endl; 138 // cout<<out[1]<<endl; 139 // cout<<out[2]<<endl; 140 } 141 k++; 142 } 143 return 0; 144 } 145 /* 146 */ 147 /* 148 8 149 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 150 00000000000000000000000000000000000000010010001101000101011001111000100110101011000000000000000000000000000000000000000000000000 151 00000000000000000000000000000000000000010010001100000000000000000000000000000000000000000000000001000101011001111000100110101011 152 11111111111111111111111111110000000000000000000000000000000000000000000000001111000000000000000000000000000000000000000000000000 153 00010001000100010001000100010000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000 154 00010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001 155 00000001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001 156 00010001000100010001000100010001000100000001000100010001000100010001000100010001000100010001000100010001000100010001000100010001 157 */