求调
[CSP-J 2021] 网络连接 - 洛谷
测试点对错情况
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
struct internet
{
string op,ad;
int num;//这台机器的编号
internet(string _op,string _ad,int _num):op(_op),ad(_ad),num(_num){}
internet(){}
friend bool check(internet x)//检查地址是否合法
{
//储存当前数字,地址内有.或:的个数,当前数字的长度(不含前导0)
long long num=0,point_cnt=0,num_len=0;
bool is_front_zero=0;//存储是否有前导零
for(int i=0;i<x.ad.length();i++)//遍历地址
{
char tmp=x.ad[i];//存储当前字符
if(tmp>='0'&&tmp<='9')//如果是数字
if(num_len==0&&tmp=='0')//如果有前导零
{
is_front_zero=1;
num_len++;
}
else//否则就更新这个数字
{
num=num*10+(tmp-'0');
num_len++;
}
else if(tmp=='.')//如果遇到了.
{
point_cnt++;
if(point_cnt>3)//.最多有3个
return 0;
if(!(num>=0&&num<=255))//如果数字大小不合法
return 0;
if(is_front_zero&&num_len>1)//如果有前导零
return 0;
if(num_len<=0)//如果没有数字
return 0;
num=0;
num_len=0;
is_front_zero=0;
}
else if(tmp==':')//如果遇到了:
{
point_cnt++;
if(point_cnt!=4)//:只能是第四个
return 0;
if(!(num>=0&&num<=255))//如果数字大小不合法
return 0;
if(is_front_zero&&num_len>1)//如果有前导零
return 0;
if(num_len<=0)//如果没有数字
return 0;
num=0;
num_len=0;
is_front_zero=0;
}
}
if(!(num>=0&&num<=65535))//判断最后一个数字
return 0;
if(is_front_zero&&num_len>1)//是否有前导零
return 0;
if(point_cnt==4&&num_len>0)//是否刚好有四个符号且有数字
return 1;
}
}a[10010];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
string op,ad;
cin>>op>>ad;
internet m=internet(op,ad,i);
if(!check(m))//先判断是否合法
{
cout<<"ERR"<<endl;
continue;
}
if(m.op=="Server")//如果是服务机
{
bool flag=0;
for(int j=1;j<=cnt;j++)
if(a[j].ad==m.ad)
{
cout<<"FAIL"<<endl;
flag=1;
break;
}
if(!flag)
{
a[++cnt]=m;
cout<<"OK"<<endl;
}
}
else//否则就是客户机
{
bool flag=0;
for(int j=1;j<=cnt;j++)
if(a[j].ad==m.ad)
{
cout<<a[j].num<<endl;
flag=1;
break;
}
if(!flag)
cout<<"FAIL"<<endl;
}
}
return 0;
}