CCF认证 2018-12 CIDR合并

题目挺长,但是说的挺清楚,最后还直接给出了算法,直接按照给出的算法就能得出答案

我们只需要处理输入和输出,将格式转化为自己熟悉的格式方便接下来的处理即可

这次的第三题对时间卡的挺紧,在同级合并那里我用了链表优化,不然会超时

还有一开始我用string保存ip,结果最后一组数据过不去

之后改用了整型保存,再用特定的方法处理,比string快很多

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=1e6+10;
long long P[34]; //倒着保存2的幂次
struct IP
{
    ll s;
    int len;
    bool operator < (const IP &u) const
    {
        if(su.s) return false;
        return lenb.len) return false;
    if(a.s/P[a.len+1]!=b.s/P[a.len+1]) return false;
    return true;
}
int l[N];
string ans[N];
int main()
{
    P[33]=1;
    for(int i=32;i>=0;i--)
        P[i]=2*P[i+1];
    int n;
    scanf("%d",&n);
    if(n==0) return 0;
    string str;
    //输入并转化格式
    for(int k=0;k>str;
        int t=0,num1=0,num2=0;
        ll ret=0;
        for(int i=0;inum1;i--)
                ret=ret*256;
        }
        if(!num2) ip[k].len=(num1+1)*8;
        ip[k].s=ret;
        //cout<=0;k--)
                ans[cnt]+=s[k];
            if(j==4) break;
            ans[cnt]+=".";
        }
        ans[cnt]+='/';
        t=ip[i].len;
        string s="";
        do
        {
            s+='0'+t%10;
            t/=10;
        }while(t);
        for(int k=s.length()-1;k>=0;k--)
            ans[cnt]+=s[k];
        cnt++;
    }
    //输出
    for(int i=cnt-1;i>=0;i--)
        cout<

 

你可能感兴趣的:(CCF认证历年真题)