zoukankan      html  css  js  c++  java
  • 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("
    ");
    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 */
  • 相关阅读:
    使用SoapUI发送Post请求
    webservice wsdl地址
    BurpSuite(二) proxy 模块
    BurpSuite(一)工具介绍
    Windows下配置DVWA
    .Net WebApi 支持跨域访问使用 Microsoft.AspNet.WebApi.Cors
    小程序学习 (一) 入门准备
    学习EChart.js(四) 移动端显示
    JQuery 获取select 的value值和文本值
    JS 获取URL参数
  • 原文地址:https://www.cnblogs.com/CharlieWade/p/11298616.html
Copyright © 2011-2022 走看看