2019牛客暑期多校训练营(第六场)B-Shorten IPv6 Address

[题目大意]

给你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("\n");
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 */

 

posted @ 2019-08-04 16:28  SpringYEP  阅读(285)  评论(0编辑  收藏  举报