zoukankan      html  css  js  c++  java
  • CodeForces 250B Restoring IPv6

    Problem Description 

    An IPv6-address is a 128-bit number. For convenience, this number is recorded in blocks of 16 bits in hexadecimal record, the blocks are separated by colons — 8 blocks in total, each block has four hexadecimal digits. Here is an example of the correct record of a IPv6 address: "0124:5678:90ab:cdef:0124:5678:90ab:cdef". We'll call such format of recording an IPv6-address full.

    Besides the full record of an IPv6 address there is a short record format. The record of an IPv6 address can be shortened by removing one or more leading zeroes at the beginning of each block. However, each block should contain at least one digit in the short format. For example, the leading zeroes can be removed like that: "a56f:00d3:0000:0124:0001:f19a:1000:0000"  → "a56f:d3:0:0124:01:f19a:1000:00". There are more ways to shorten zeroes in this IPv6 address.

    Some IPv6 addresses contain long sequences of zeroes. Continuous sequences of 16-bit zero blocks can be shortened to "::". A sequence can consist of one or several consecutive blocks, with all 16 bits equal to 0.

    You can see examples of zero block shortenings below:

    • "a56f:00d3:0000:0124:0001:0000:0000:0000"  →  "a56f:00d3:0000:0124:0001::";
    • "a56f:0000:0000:0124:0001:0000:1234:0ff0"  →  "a56f::0124:0001:0000:1234:0ff0";
    • "a56f:0000:0000:0000:0001:0000:1234:0ff0"  →  "a56f:0000::0000:0001:0000:1234:0ff0";
    • "a56f:00d3:0000:0124:0001:0000:0000:0000"  →  "a56f:00d3:0000:0124:0001::0000";
    • "0000:0000:0000:0000:0000:0000:0000:0000"  →  "::".

    It is not allowed to shorten zero blocks in the address more than once. This means that the short record can't contain the sequence of characters "::" more than once. Otherwise, it will sometimes be impossible to determine the number of zero blocks, each represented by a double colon.

    The format of the record of the IPv6 address after removing the leading zeroes and shortening the zero blocks is called short.

    You've got several short records of IPv6 addresses. Restore their full record.

    Input
     
    The first line contains a single integer n — the number of records to restore (1 ≤ n ≤ 100).

    Each of the following n lines contains a string — the short IPv6 addresses. Each string only consists of string characters "0123456789abcdef:".

    It is guaranteed that each short address is obtained by the way that is described in the statement from some full IPv6 address.

    Output
     
    For each short IPv6 address from the input print its full record on a separate line. Print the full records for the short IPv6 addresses in the order, in which the short records follow in the input.
     
    Sample Input
     
    6
    a56f:d3:0:0124:01:f19a:1000:00
    a56f:00d3:0000:0124:0001::
    a56f::0124:0001:0000:1234:0ff0
    a56f:0000::0000:0001:0000:1234:0ff0
    ::
    0ea::4d:f4:6:0
     
    Sample output
     
    a56f:00d3:0000:0124:0001:f19a:1000:0000
    a56f:00d3:0000:0124:0001:0000:0000:0000
    a56f:0000:0000:0124:0001:0000:1234:0ff0
    a56f:0000:0000:0000:0001:0000:1234:0ff0
    0000:0000:0000:0000:0000:0000:0000:0000
    00ea:0000:0000:0000:004d:00f4:0006:0000
     
     
    题意:大意是说给定一个ipv6地址的简记形式,让你给它补全输出。一个ipv6地址是由8个小地址组成,每个小地址由':'隔开。简记的规则大致是把地址中的一部分前缀0去掉,或去掉一连串的0,用::来代替。
     
     
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 int main()
     7 {
     8     //数组str1用来存输入的ipv6地址的简记形式,数组str2用来存输出的ipv6地址的形式
     9     char str1[50], str2[50];
    10     //cnt用来存小地址的个数,flag用来标记是否为':',c用来判断小地址的字符数是否达到4个
    11     int n, c, i, j, k, cnt, flag;
    12     cin >> n;
    13     while (n--){
    14         flag = cnt = 0;
    15         scanf("%s", str1);
    16         k = strlen(str1);
    17         //在数组str1后加':',保证最后一个小地址能计入个数
    18         str1[k] = ':';
    19         str1[k+1] = '';
    20         //初始化数组str2
    21         for (i=0; i<=38; i++){
    22             if (i == 4 || i == 9 || i == 14 || i == 19 || i == 24 || i == 29 || i == 34)
    23                 str2[i] = ':';
    24             else
    25                 str2[i] = '0';
    26         }
    27         //计算小地址的个数
    28         for (i=0; i<=k; i++){
    29             if (str1[i] != ':')
    30                 flag = 1;
    31             else if (flag == 1){
    32                 cnt++;
    33                 flag = 0;
    34             }
    35         }
    36         c = 0;
    37         j = 38;
    38         //操作j的位置来控制数组str2的字符
    39         for (i=k-1; i>=0; i--){
    40             if (str1[i] != ':'){
    41                 c++;
    42                 str2[j--] = str1[i];
    43             }
    44             if (str1[i] == ':'){
    45                 if (c == 4)
    46                     j--;
    47                 else if (c == 3)
    48                     j = j - 2;
    49                 else if (c == 2)
    50                     j = j - 3;
    51                 else if (c == 1)
    52                     j = j - 4;
    53                 c = 0;
    54             }
    55             if (str1[i] == ':' && str1[i-1] == ':'){
    56                 j = j - ((8 - cnt) * 4 + (8 - cnt));
    57                 i--;
    58             }
    59         }
    60         for (i=0; i<=37; i++)
    61             cout << str2[i];
    62         cout << str2[38] << endl;
    63     }
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    Android PopupWindow 弹窗背景半透明,设置最大高度
    Android性能优化之:ViewStub
    EventBus使用详解(一)——初步使用EventBus
    Android开发中,那些让你相见恨晚的方法、类或接口
    android 提高进程优先级 拍照永不崩溃(闪退)
    Android框架 加载图片 库 Picasso 的使用简介
    vc 取windows系统信息 版本 cpu信息 内存信息 ie版本信息 office版本
    VC 三点 划 曲线
    VC 类泡泡龙游戏算法
    vc 判断哪个按键 被按下 消息 按键 状态
  • 原文地址:https://www.cnblogs.com/hgfblog/p/3874109.html
Copyright © 2011-2022 走看看