网络连接(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 }