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<<"\n"; } } int main() { init(); solve1(); solve2(); print(); }