codeforces 250B Restoring IPv6

题目:大意是在说给定一个ipv6地址的简记形式,让你给它补全输出。

简记的规则大致是把地址中的一部分0去掉,其中还包括一连串的0,此时可用::来代替。

方法:首先记录给定的字符串中的:的个数,让后就能确定::中间要补全的0000的个数,然后对于每个小地址(例如bfd),补全失去的0就好了,这时候可以使用printf输出补0的功能,即:printf("%04s",s);

注意:本来每个字符串中:的个数是不能超过7个的,但是会出现::连用,就可能出现8个,这样对于计算::之间补全0000的个数计算就会造成困难,所以要单独处理。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        char s[100];
        char t[5];
        memset(t,0,sizeof(t));
        cin>>s;
        int len=strlen(s),k=0 ;
        int ans=0,tt=0;
        for(int i=0; i<len; i++)
            if(s[i]==‘:‘) ans++;
        ans=7-ans;
        if(ans<0)
            for(int i=0; i<len; i++)
            {
                if(s[i]==‘:‘&&s[i+1]==‘:‘)
                {
                    for(int j=i+1; j<len; j++)
                        s[j]=s[j+1];
                    len--;
                    break;
                }

            }
            for(int i=0; i<len; i++)
            {
                if(s[i]==‘:‘)
                {
                    printf("%04s",t);
                    k++;
                    if(k<8) cout<<":";
                    if(s[i+1]==‘:‘)
                        for(int j=1; j<=ans; j++)
                        {
                            printf("0000");
                            k++;
                            if(k<8) cout<<":";
                        }
                    memset(t,0,sizeof(t));
                    tt=0;
                }
                else
                    t[tt++]=s[i];
            }
        printf("%04s",t);
        cout<<endl;
    }
    return 0;
}

codeforces 250B Restoring IPv6,码迷,mamicode.com

时间: 2024-10-12 04:10:58

codeforces 250B Restoring IPv6的相关文章

CodeForces 250B Restoring IPv6 解题报告

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 o

CodeForces250B——Restoring IPv6(字符串处理)

Restoring IPv6 DescriptionAn 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 i

codeforces 509D Restoring Numbers

codeforces 509D Restoring Numbers 题意: v[i][j]=(a[i]+b[j])%k 现在给出n*m矩阵v[][], 求a[],b[]和k, 任意一种情况都行. 限制: 1 <= n,m <= 100; 0 <= v[i][j] <= 100 思路: 对于数组a[], 无论怎么变, 数组之间的差始终不变, b[]也同理 利用这个求出k 再设a[0]=0,b[0]=0,求出剩下的东西.

Codeforces 490E. Restoring Increasing Sequence 二分

统计有几个'?',然后二分检测取满足条件的最小的数就可以了. 注意没有问号的时候也要检测一下.... E. Restoring Increasing Sequence time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Peter wrote on the board a strictly increasing sequence o

CodeForces 490E Restoring Increasing Sequence(贪心)

CodeForces 490E 题目大意:给N个正整数,然而这些正整数中间有些数字是被'?'遮挡住了,每个'?'可以还原回一个数字,希望给定的这N个整数形成一个递增的序列.可以的话,给出这N个整数的序列,不行返回N0. 解题思路:每个整数都在满足条件的情况下尽量的小,写了一个非递归版本的,发现要考虑的因素太多了,wa了太多遍.后面改成了递归版本的,但是这个比较耗时. 代码: #include <cstdio> #include <cstring> const int MAXL =

CodeForces 490E Restoring Increasing Sequence

题意: 一个严格递增序列  某些数字的某些位被盖住了  求  恢复后的序列 思路: 贪心  让每个数在大于前一个的基础上尽量的小 先讨论数字长度 len[i]<len[i-1] 一定是NO len[i]>len[i-1] 除了第一位如果是?就填1以外  其他?全填0 len[i]==len[i-1] dfs搜索num[i]格式下大于num[i-1]的最小的数 代码: #include<cstdio> #include<iostream> #include<cstr

Codeforces.566E.Restoring Map(构造)

题目链接 \(Description\) 对于一棵树,定义某个点的邻居集合为所有距离它不超过\(2\)的点的集合(包括它自己). 给定\(n\)及\(n\)个点的邻居集合,要求构造一棵\(n\)个点的树,使得每个给定的集合都对应一个点.输入保证有解. \(n\leq1000\). \(Solution\) 如果两个点的邻居集合大小为\(2\),那么交集中的两个点之间一定有边.这样我们就可以\(O(\frac{n^3}{w})\)确定出非叶节点以及它们之间的连边. 然后考虑叶节点应该挂到哪里.如果

Codeforces 1315C Restoring Permutation

You are given a sequence b1,b2,…,bnb1,b2,…,bn . Find the lexicographically minimal permutation a1,a2,…,a2na1,a2,…,a2n such that bi=min(a2i−1,a2i)bi=min(a2i−1,a2i) , or determine that it is impossible. Input Each test contains one or more test cases.

codeforces 509 D. Restoring Numbers(数学+构造)

题目链接:http://codeforces.com/problemset/problem/509/D 题意:题目给出公式w[i][j]= (a[i] + b[j])% k; 给出w,要求是否存在这样的数列,若存在则求出a,b 和k 题解:如果有符合条件的点的话那么a[i],b[j]可以任意转换比如说a[i],b[j]可以转化为a[i]-p,b[i]+p.所以只要存在 符合条件的解的a[i]可以为任意值.也就是说a[i]可以先赋值为0然后其他就都可以推出来了,当然开始推出后会发现 有负的,没事,