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  } 

 

posted @ 2022-10-02 11:23  要不要吃哈密瓜  阅读(21)  评论(0编辑  收藏  举报