题解 P2815 【IPv6地址压缩】
RocksonLee · · 题解
这是本蒟蒻第一次发题解,有点悬……
这道题采用暴力通过,不过坑点有点多,因为这样,才能成为绿题(刷的时候还被黄了)。
这道题并不是很难,题目的点都得好好瞧瞧,有点烦……
先是找最长的全“0”字段
int i1,i2,t;
bool ok;
for (i1=0,t=0;i1<8;i1++)
{
ok=true;
for (i2=0;i2<4;i2++)
{
if (a[i1*5+i2]!='0')
{
ok=false; //如果有一个非0字符则跳出循环
break;
}
}
if (ok)
{
t++; //计数器
if (t>maxn)
{
maxn=t;
maxi=i1;
}
}
else t=0;
}
if (maxn==1) maxi=-1;
maxi=maxi-maxn+1;
处理时需要注意windows和macos规则不同,当全“0”字段只有一个,用“::”就没法AC了,应该像处理剩下的“0”那样处理。
处理剩下的“0”
while (a[i1*5+i2]=='0'&&i2<3) i2++;
有点暴力,直接无视跳过前导零和余下全“0”字段。
本人AC代码
#include <bits/stdc++.h> //传说神奇的万能头文件
using namespace std;
char a[39];
int maxi=-1,maxn=1;
void find () //寻找最长"0000"字段函数
{
int i1,i2,t;
bool ok;
for (i1=0,t=0;i1<8;i1++)
{
ok=true;
for (i2=0;i2<4;i2++)
{
if (a[i1*5+i2]!='0')
{
ok=false; //如果有一个非0字符则跳出循环
break;
}
}
if (ok)
{
t++; //计数器
if (t>maxn)
{
maxn=t;
maxi=i1;
}
}
else t=0;
}
if (maxn==1) maxi=-1; //windows和mac os压缩规则不一致
maxi=maxi-maxn+1;
}
int main ()
{
scanf("%s",a);
find();
int i1,i2;
for (i1=0;i1<8;i1++)
{
if (maxi==i1) //将最长字段压缩成“::”
{
cout<<":";
if (i1==0) cout<<":";
i1=i1+maxn;
if (i1>7) break;
}
i2=0;
while (a[i1*5+i2]=='0'&&i2<3) i2++; //处理全“0”字段
for (;i2<4;i2++)
{
cout<<a[i1*5+i2];
}
if (i2==4&&i1!=7) cout<<":"; //最后一个字段无需“:”
}
return 0;
}