zoukankan      html  css  js  c++  java
  • CCF201812-3 CIDR合并

    按题意模拟即可。。。主要CCF吞代码。。。

    #include<bits/stdc++.h>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ls (x<<1)
    #define rs (x<<1|1)
    #define ll long long
    #define For(i,a,b) for(int i=a;i<=b;i++)
    #define Forr(i,a,b) for(int i=a;i>=b;i--)
    #define Fr(i,a,b) for(int i=a;i<b;i++)
    #define Frr(i,a,b) for(int i=a;i>b;i--)
    #define pll pair<ll,ll>
    using namespace std;
    const int maxn=1e6+100;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    struct node
    {
    	int s[5];
    	friend bool operator<(node a,node b)
    	{
    		if(a.s[0]!=b.s[0])return a.s[0]<b.s[0];
    		if(a.s[1]!=b.s[1])return a.s[1]<b.s[1];
    		if(a.s[2]!=b.s[2])return a.s[2]<b.s[2];
    		if(a.s[3]!=b.s[3])return a.s[3]<b.s[3];
    		return a.s[4]>b.s[4];
    	}
    }no[maxn];
    int n,m;
    string str;
    int p[10],q[10];
    int cnt1,cnt2;
    int cal(int l,int r)
    {
    	int ans=0;
    	int sr=1;
    	for(int i=r;i>=l;i--)
    	{
    		ans+=(str[i]-'0')*sr;
    		sr*=10;
    	}
    	return ans;
    }
    void init()
    {
    	cin>>n;getchar();
    	for(int i=1;i<=n;i++)
    	{
    		cin>>str;
    		int len=str.length();
    		cnt1=cnt2=0;
    		for(int j=0;j<len;j++)
    		{
    			if(str[j]=='.')p[++cnt1]=j;
    			if(str[j]=='/')q[++cnt2]=j;
    		}	
    		int las=0;
    		if(!cnt1)
    		{
    			if(!cnt2)
    			{
    				no[i].s[0]=cal(0,len-1);
    				no[i].s[4]=8;
    			}
    			else
    			{
    				no[i].s[0]=cal(0,q[1]-1);
    				no[i].s[4]=cal(q[1]+1,len-1);
    			}
    		}
    		else
    		{
    			for(int j=1;j<=cnt1;j++)
    			{
    				int pl=p[j];
    				no[i].s[j-1]=cal(las,pl-1);
    				las=pl+1;
    			}
    			if(cnt2)
    			{
    				no[i].s[cnt1]=cal(las,q[cnt2]-1);
    				no[i].s[4]=cal(q[cnt2]+1,len-1);
    			}
    			else
    			{
    				no[i].s[cnt1]=cal(las,len-1);
    				no[i].s[4]=(cnt1+1)*8;
    			}
    		}
    	}
    
    }
    int nxt[maxn];
    pair<ll,ll> cal1(node aa)
    {
    	ll tmp=0;
    	ll st=1;
    	for(int i=3;i>=0;i--)
    	{
    		tmp+=aa.s[i]*st;
    		st*=256;
    	}
    	ll minn=(tmp/(1ll<<(32-aa.s[4])))*(1ll<<(32-aa.s[4]));
    	ll maxx=minn+(1ll<<(32-aa.s[4]))-1;
    	return mp(minn,maxx);
    }
    void solve1()
    {
    	sort(&no[1],&no[n+1]);
    	for(int i=1;i<=n;i++)
    	{
    		nxt[i]=i+1;
    	}
    	for(int i=1;i<=n;i=nxt[i])
    	{
    		int tt=nxt[i];
    		if(tt>n)break;
    		while(1)
    		{
    			if(tt>n)break;
    			pll a1=cal1(no[i]),a2=cal1(no[tt]);
    			if(a1.fi>=a2.fi&&a2.se>=a1.se)
    			{
    				no[i]=no[tt];
    				nxt[i]=nxt[tt];
    				tt=nxt[tt];
    			}
    			else if(a1.fi<=a2.fi&&a2.se<=a1.se)
    			{
    				nxt[i]=nxt[tt];
    				tt=nxt[tt];
    			}
    			else
    			{
    				break;
    			}
    		}	
    	}
    }
    int pr[maxn];
    void solve2()
    {
    	int pre=0;
    	for(int i=1;i<=n;i=nxt[i])
    	{
    		int tt=nxt[i];
    		int pre1=pre;
    		int j=i;
    		pr[i]=pre;
    		if(tt>n)break;
    		while(1)
    		{
    			tt=nxt[i];if(tt>n)break;
    			int flg=0;
    			if(no[i].s[4]==no[tt].s[4])
    			{
    				node ne=no[i];
    				if(no[i].s[4])
    					ne.s[4]=no[i].s[4]-1;
    				pll v1=cal1(ne);
    				pll v2=cal1(no[i]),v3=cal1(no[tt]);
    				if(v1.se-v1.fi==v3.se-v2.fi&&v2.fi==v1.fi&&v3.se==v1.se&&v2.se+1==v3.fi)
    				{
    					flg=1;
    					no[i]=ne;
    					nxt[i]=nxt[tt];
    				}
    				if(flg&&pre)
    				{
    					i=pr[i];
    					pre=pr[i];
    				}
    				if(!flg)
    				{
    					break;
    				}
    			}
    			else
    			{
    				break;
    			}
    		}
    		pre=i;
    	}
    }
    void print()
    {
    	for(int i=1;i<=n;i=nxt[i])
    	{
    		for(int j=0;j<=4;j++)
    		{
    			cout<<no[i].s[j];
    			if(j<3)cout<<".";
    			if(j==3)cout<<"/";
    		}cout<<"
    ";
    	}
    }
    int main()
    {
    	init();
    	solve1();
    	solve2();
    	print();
    }
    

      

  • 相关阅读:
    零点起飞学FlashCS6动画制作
    注意 方法的执行 顺序,并且 如果 为 nil的话,bool类型的数据 也默认是有值的,
    datepicker 的一个属性,
    用户体验 的一个原则,
    break 一下 便会 跳出 整个 switch ,
    原来 同一个 bundleid的项目 的下面 可以 通过这个 解决,诡异的问题,
    section 和 row,
    缓存,plist 和 json
    本地通知,UILocalNotification
    bundle id
  • 原文地址:https://www.cnblogs.com/intwentieth/p/10484607.html
Copyright © 2011-2022 走看看