[Luogu] P7911 [CSP-J 2021] 网络连接

发布时间 2023-11-24 20:25:47作者: ccrazy_bboy

[CSP-J 2021] 网络连接 - 洛谷

距离CSP2023还有 \(**3**\)

题意及思路

恶臭大模拟,按照题意模拟即可。有几个代码上的难点:

  1. 当定义了一个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,因为所有数及字符串都符合该规则

  2. 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;
}