这是测试点情况
下载了一下#13的数据,编译器上的报错是这样的:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_M_create
Abort signal from abort(3) (SIGABRT)
代码如下:
#include <iostream>
#include <string>
using namespace std;
int n;
string ad[1005];//存储每台计算机的地址
int op[1005];//记录计算机的型号: 服务机(Server):0, 客户机(Client):1
int sit[1005];//记录每台计算机最终的连接情况
bool judge(string ad){
int len = ad.length();
int last = -1;
int cnt = 1;
string numstr[6];
for (int i = 0; i<len; i++){
if(ad[i]<'0'||ad[i]>'9'){//为符号
if((cnt<=3 && ad[i]!='.') || (cnt>3 && ad[i]!=':')) return false;//符号用错
if(last+1==i) return false;//两个符号连在一起
last = i;
cnt++;
continue;
}else{//为数字
numstr[cnt] += ad[i];
}
if(last+1==i){
if(i+1==ad.length()) continue;
if(ad[i]=='0' && '0'<=ad[i+1] && ad[i+1]<='9') return false;//有先导0
}
}
if(cnt!=5) return false;
for (int i = 1; i<=5; i++){
int lenn = numstr[i].length();
int power = 1;
int num = 0;
for (int j = lenn-1; j>=0; j--){
num += power*(numstr[i][j]-'0');
power *= 10;
}
if((i<=4 && (num<0||num>255)) || (i==5 && (num<0||num>65535))) return false;
}
return true;
}
int main(){
cin >> n;
for (int i = 1; i<=n; i++){
string t;
cin >> t;
if(t=="Server") op[i] = 0;
else op[i] = 1;
cin >> ad[i];
}
for (int i = 1; i<=n; i++){
//是否合规
if(!judge(ad[i])){
sit[i] = -1;
continue;
}
//能否成功建立连接
if(op[i]==0){//若为服务机
int k = -10;
for (int j = 1; j<i; j++){
if(op[j]==1) continue;
if(ad[j]==ad[i]){
k = -2;
break;
}
}
sit[i] = k;
}else{//若为客户机
int k = -2;
for (int j = 1; j<i; j++){
if(op[j]==1) continue;
if(ad[j]==ad[i]){
k = j;
break;
}
}
sit[i] = k;
}
}
for (int i = 1; i<=n; i++){
switch(sit[i]){
case -1: cout << "ERR" << endl;
break;
case -2: cout << "FAIL" << endl;
break;
case -10: cout << "OK" << endl;
break;
default:
cout << sit[i] << endl;
}
}
return 0;
}