2022-J T3网络连接
考场甚至没来得及看(悲)
一定要选好考试策略啊喂
事后看到这个题第一反应肯定就是模拟了(怎么又是模拟)
主要就是判断是否合法比较麻烦
尤 其 是 前 导 零
很麻烦(悲)
所以只得到了65分(真的看不出哪里没讨论了)
让我们来观摩一下
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 //abcde均为非负整数 ,不含有多余的前导0 9 //abcd<=255,e<=65535 10 //是个字符串 11 // 12 string op[1005],ad[1005]; 13 string a,b,c,d,e; 14 int n; 15 16 int heb(string s,int a,int b) 17 { 18 int t=1,ans=0; 19 for(int i=b;i>=a;i--) 20 { 21 ans+=(s[i]-'0')*t; 22 t*=10; 23 } 24 return ans; 25 } 26 27 bool bound(string s,int len) 28 { 29 int cnt1=0;int cnt2=0; 30 int last=0; 31 int num=0; 32 for(int i=0;i<len;i++) 33 { 34 num++; 35 if(s[i]=='.') 36 { 37 38 int t=heb(s,last,last+num-2); 39 cnt1++; 40 if(cnt1>3) return 0; 41 if(s[last]<'0'||s[last]>'9') return 0; 42 if(s[last]=='0'&&s[last+1]!=s[i])return 0; 43 if(s[last]=='-'||s[last]=='.') return 0; 44 last=i+1; 45 num=0; 46 if(t>255||t<0) return 0; 47 } 48 if(s[i]==':') 49 { 50 cnt2++; 51 if(cnt1!=3||cnt2!=1) return 0; 52 53 int t=heb(s,last,last+num-2); 54 if(t>255||t<0) return 0; 55 if(s[last]<'0'||s[last]>'9') return 0; 56 if(s[last]=='0'&&s[last+1]!=s[i])return 0; 57 if(s[last]=='-'||s[last]==':') return 0; 58 59 last=i+1; 60 if(s[last]=='0'&&s[last+1]!=s[i])return 0; 61 if(s[last]==')') return 0; 62 t=heb(s,last,len-1); 63 if(t<0||t>65535) return 0; 64 } 65 } 66 if(cnt1!=3&&cnt2!=1) return 0; 67 return 1; 68 } 69 70 int ok=0; 71 72 int main() 73 { 74 cin>>n; 75 for(int i=1;i<=n;i++) 76 { 77 cin>>op[i]; 78 cin>>ad[i]; 79 int len=ad[i].length(); 80 ad[i]+=')'; 81 if(op[i]=="Server") 82 { 83 if(!bound(ad[i],len)) 84 { 85 cout<<"ERR"<<endl; 86 continue; 87 } 88 ok=0; 89 for(int j=1;j<i;j++) 90 { 91 if(op[j]==op[i]) 92 if(ad[i]==ad[j]) 93 { 94 cout<<"FAIL"<<endl; 95 ok=1; 96 break; 97 } 98 } 99 if(ok==0) 100 cout<<"OK"<<endl; 101 } 102 if(op[i]=="Client") 103 { 104 if(!bound(ad[i],len)) 105 { 106 cout<<"ERR"<<endl; 107 continue; 108 } 109 ok=0; 110 for(int j=1;j<i;j++) 111 { 112 if(op[j]=="Server"&&ad[j]==ad[i]) 113 { 114 ok=j; 115 break; 116 } 117 } 118 if(ok==0) cout<<"FAIL"<<endl; 119 else cout<<ok<<endl; 120 } 121 } 122 123 return 0; 124 }
不足:
1.模拟不够全面
2.数组运用不恰当(题目给的abcde不香吗不香吗不香吗!!!)
3.思维创新w
那我们就不模拟了(什
前导零这个东西
sscanf请求出战(
简单来说就是将这些字符强制转化为数字(也就是没有前导零了)
然后再将这些数字转化为字符
判断两个字符串是否相等即可判断有无前导零
好了!代码——
1 #include<bits/stdc++.h> 2 #include<iostream> 3 #include<cstdio> 4 #include<string> 5 #include<cstring> 6 #include<algorithm> 7 #include<cmath> 8 using namespace std; 9 //abcde均为非负整数 ,不含有多余的前导0 10 //abcd<=255,e<=65535 11 //是个字符串 12 // 13 string op[1005],ad[1005]; 14 int n; 15 16 bool check(string s) 17 { 18 int a=-1,b=-1,c=-1,d=-1,e=-1; 19 int t=sscanf(s.c_str(),"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);//将字符串转化成数字(这时候前导零已经被过滤) 20 if(t!=5)return 0; 21 if(a<0||a>255||b<0||b>255||c<0||c>255||d<0||d>255||e<0||e>65535) return 0; 22 char s2[1005]; 23 sprintf(s2,"%d.%d.%d.%d:%d",a,b,c,d,e); 24 int len=s.length(); 25 for(int i=1;i<=len;i++) 26 if(s[i]!=s2[i]) return 0; 27 return 1; 28 } 29 30 int ok=0; 31 32 int main() 33 { 34 cin>>n; 35 for(int i=1;i<=n;i++) 36 { 37 cin>>op[i]; 38 cin>>ad[i]; 39 if(op[i]=="Server") 40 { 41 if(!check(ad[i])) 42 { 43 cout<<"ERR"<<endl; 44 continue; 45 } 46 ok=0; 47 for(int j=1;j<i;j++) 48 { 49 if(op[j]==op[i]) 50 if(ad[i]==ad[j]) 51 { 52 cout<<"FAIL"<<endl; 53 ok=1; 54 break; 55 } 56 } 57 if(ok==0) 58 cout<<"OK"<<endl; 59 } 60 if(op[i]=="Client") 61 { 62 if(!check(ad[i])) 63 { 64 cout<<"ERR"<<endl; 65 continue; 66 } 67 ok=0; 68 for(int j=1;j<i;j++) 69 { 70 if(op[j]=="Server"&&ad[j]==ad[i]) 71 { 72 ok=j; 73 break; 74 } 75 } 76 if(ok==0) cout<<"FAIL"<<endl; 77 else cout<<ok<<endl; 78 } 79 } 80 return 0; 81 }