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();
}

  

原文地址:https://www.cnblogs.com/intwentieth/p/10484607.html