网络连接(CSP-J 2021 T3)

 

 一道又臭又长的模拟题目。。。。。

主要有几个小技巧可以帮大家省一省代码:

1.scanf("%d.%d",&b,&c);

这里是定了一个格式如果不按格式来就不输入后面的内容

程序中用来分离数字方便计算

2.sscanf(a,"%d.%d",&a,&b);

这是从a字符串中读入a和b他反回的是读入了几个数

程序中用来判断格式是否正确

3.scanf(" %c",&a)

在%c前面加一个空格可以直接排除空格,TAB,换行达到极高的效率。

本命令在此文中无作用

4.

sprintf(s,"%d.%d.%d.%d:%d",a,b,c,d,e);
他与ssscanf相反他把一定格式的内容打印进字符串。
这个东东结合strlen()来比较先后长短来排除先导0

5.

map数组是一个映射数组

在程序中用来记录有没有服务器

程序?

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<string,int> m; 
 4 int main()
 5 {
 6 //    freopen("1.in","r",stdin);
 7 //    freopen("1.out","w",stdout);
 8     int n;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;++i)
11     {
12         char op[100],ad[100];
13         cin>>op>>ad;
14         int a,b,c,d,e;
15         if(sscanf(ad,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e)!=5)
16         {
17             cout<<"ERR"<<endl;
18             continue;
19         }
20         if(a<0||a>255||b<0||b>255||c<0||c>255||d<0||d>255||e<0||e>65535)
21         {
22             cout<<"ERR"<<endl;
23             continue;
24         }
25         char s[100];
26         sprintf(s,"%d.%d.%d.%d:%d",a,b,c,d,e);
27         if(strlen(s)!=strlen(ad))
28         {
29             cout<<"ERR"<<endl;
30             continue;
31         }
32         if(op[0]=='S')
33         {
34             if(m[ad]==0)
35             {
36                 m[ad]=i;
37                 cout<<"OK"<<endl;
38                 continue;
39             }
40             else
41             {
42                 cout<<"FAIL"<<endl;
43             }
44         }
45         else
46         {
47             if(m[ad]!=0)
48             {
49                 printf("%d\n",m[ad]);
50                 continue;
51             }
52             else
53             {
54                 printf("FAIL\n");
55             }
56         }
57     }
58     return 0;
59 }

 

posted @ 2022-05-28 22:38  王浩泽  阅读(225)  评论(0编辑  收藏  举报