70分求调,必关
查看原帖
70分求调,必关
948446
bh33楼主2024/10/4 17:38

测试点13,17,18,19,20,21wa了

#include<bits/stdc++.h> 
using namespace std;
const int N=1e5+10;
int n,st,sd,sm;
long long num;
bool f,q;
string op,ad;
map<string,int>m;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>op>>ad;
		if(ad.size()>21||ad.size()<9){
			cout<<"ERR"<<endl;
			continue;
		}
		num=0;st=0;sd=0;sm=0;q=0;
		for(int j=0;j<ad.size();j++){
			if(!q&&ad[j]=='0'&&ad[j+1]>'0'&&ad[j+1]<'9'&&j+1!=ad.size()){//注意末尾0是可行的(注意我到底想填可行还是不可行的条件);修改后要再编译一遍,并查一遍所有样例;排除可行(优先排除较为简单的)的就是不可行的(可行与不可行之间不要有重复 
				f=1;break;
			}
			else if(((!st||st>4)&&ad[j]=='.')||(st!=4&&ad[j]==':')){//小心‘.’在‘:’后面 
				f=1;break;
			}
			else if(num>65535){
				f=1;break;
			}
			else if(ad[j]=='.'||ad[j]==':'){
				if(ad[j]=='.')sd++;
				else sm++;
				if(ad[j+1]>='0'&&ad[j+1]<='9')st++;
				if(num>255){
				f=1;break;
			}
				num=0;
				q=0;
			}
			else if(ad[j]>='0'&&ad[j]<='9'){
				if(!st)st=1;
				q=1;
				num=num*10+ad[j]-'0';
			}
			else{//确保全面性:不合法的情况都是非法的 
				f=1;break;
			}  
		}//要关注开头第一个字符的状态+一个数字开头是零有可能是因为它本身就是0 
		if(ad[0]<'0'||ad[0]>'9'||ad[ad.size()-1]<'0'||ad[ad.size()-1]>'9'||num>65535||st!=5||sd!=3||sm!=1)f=1;
		if(f){
			f=0;
			cout<<"ERR"<<endl;
			continue;
		}
		if(op=="Server"){
			if(!m[ad]){
				m[ad]=i;
				cout<<"OK"<<endl;
				continue;
			}
			else {
				cout<<"FAIL"<<endl;
				continue;
			}
		}
		else{
			if(!m[ad]){
				cout<<"FAIL"<<endl;
				continue;
			}
			else{
				cout<<m[ad]<<endl;
			}
		}
	}
}
2024/10/4 17:38
加载中...