距离CSP2023还有 \(**3**\) 天
题意及思路
恶臭大模拟,按照题意模拟即可。有几个代码上的难点:
-
当定义了一个
scanf
或者sscanf
并且有一定的输入规则,那么如果读取到的字符串不符合定义的规则,那读入了几个变量就返回几个变量例如,如下代码定义了一个读取规则,但是字符串的最后一个数不符合该规则,因此读取失败,返回已经读取到的变量数量4:
#include<bits/stdc++.h> using namespace std; int a,b,c,d,e; string s="1.1.1.1.1"; int main() { cout<<(sscanf(s.c_str(),"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e))<<endl; return 0; }
而,只需要把
sscanf(s.c_str(),"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e)
改为sscanf(s.c_str(),"%d.%d.%d.%d.%d",&a,&b,&c,&d,&e)
,输出就是5,因为所有数及字符串都符合该规则 -
to_string(int x)
返回一个字符串,可以将x
转换为字符串
代码
所以最终的代码如下,其中f数组是判断该网址是否曾经出现过以及如果出现过,该网址对应的编号,便于查找与输出
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
map<string,int>f;
bool check(string s)
{
int n=s.size();
int a,b,c,d,e;
sscanf(s.c_str(),"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
string s1=to_string(a)+'.'+to_string(b)+'.'+to_string(c)+'.'+to_string(d)+':'+to_string(e);
if(s!=s1) return 0;
else if(a>255 || b>255 || c>255 || d>255 || e>65535 || a<0 || b<0 ||c<0 || d<0 || e<0 ) return 0;
else return 1;
}
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
string s,s1;
cin>>s1>>s;
if(!check(s)) cout<<"ERR"<<endl;
else if(s1=="Server")
{
if(!f[s])
{
cout<<"OK"<<endl;
f[s]=i;
}else cout<<"FAIL"<<endl;
}else
{
if(f[s]) cout<<f[s]<<endl;
else cout<<"FAIL"<<endl;
}
}
return 0;
}
标签:sscanf,string,int,Luogu,P7911,.%,字符串,CSP,255
From: https://www.cnblogs.com/lyk2010/p/17854697.html