为什么全FAIL?求助
查看原帖
为什么全FAIL?求助
464732
luqyou楼主2022/6/23 21:18
#include<bits/stdc++.h>
using namespace std;
int len[1001];//地址长度
char ad[1001][28],op[1001][10];//每个地址以及操作名
bool stcmp(int x1,int x2){//匹配函数
    if(len[x1]!=len[x2]) return false;
    for(int i=0;i<len[x1];i++){
        if(ad[x1][i]!=ad[x2][i]) return false;
    }
    return true;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
	    cin>>op[i]>>ad[i];
	    len[i]=strlen(ad[i]);
	    int fh=1,flag=0,last=-1,sum=0;
	    for(int j=0;j<len[i];j++){
	        if(ad[i][j]==':'||ad[i][j]=='.'){
	            if(j!=0&&(ad[i][j-1]==':'||ad[i][j-1]=='.')){//不能有连续的符号
	                flag=1;break;
	            }
	            if(fh==1&&j==0){//第一个"."前不能没有数
	                flag=1;break;
	            }
	            if(fh==4&&j==len[i]-1){//冒号后不能没有数
	                flag=1;break;
	            }
	            if(fh<4&&ad[i][j]!='.'){//前面三个符号不能不是“.”
	                flag=1;break;
	            }
	            if(fh==4&&ad[i][j]!=':'){//第四个符号不能不是“:”
	                flag=1;break;
	            }
	            if(fh==5){//不能多符号
	                flag=1;break;
	            }
	            fh++;
	            last=j;
	            sum=0;
	        }
	        else{
	            sum=sum*10+ad[i][j]-'0'; //读取数字
	            if(ad[i][j+1]=='.'||ad[i][j+1]==':'||j+1==len[i]){
	                //数字读完了看合不合法
	                if((sum<0||sum>255)&&fh<=4) //前四个数
	                {
	                    flag=1;break;;
	                }
	                if((sum<0||sum>65535)&&fh==5)//冒号后的数
	                {
	                    flag=1;break;;
	                }
	                int w=0;//重点,通过数字位数和字符数字位数判断前导0
	                while(sum){
	                    sum/=10;
	                    w++;
	                }
	                if(sum==0&&j-last==1) continue;//特判一个零的情况
	                if(w!=j-last){
	                    flag=1;break;;
	                }
	            }
	        }
	    }
	    if(flag==1||fh!=5){//少符号或判断出来前面不合法的情况全部输出ERR
	        printf("ERR\n");
	        continue;
	    }
	    if(op[i][0]=='5'){
	        int flag1=0;
	        for(int j=1;j<=i-1;j++){
	            if(op[j][0]=='S') continue;//客户机直接continue掉
	            if(stcmp(i,j)){//匹配上相同的服务器输出FAIL
	                printf("FAIL\n");
	                flag1=1;
	                break;
	            }
	        }
	        if(flag1==1) continue;
	        else printf("OK\n"); //匹配到新服务器输出OK
	    }
	    else{
	        int flag2=0;
	        for(int j=1;j<=i-1;j++){
	            if(op[j][0]=='S') continue;//客户机还是continue
	            if(stcmp(i,j)){//匹配上服务器输出编号
	                printf("%d\n",j);
	                flag2=2;
	                break;
	            }
	        }
	        if(flag2!=2){//无匹配输出FAIL
	            printf("FAIL\n");
	        }
	    }
	}
	return 0;
}
2022/6/23 21:18
加载中...