1. 程式人生 > 其它 >P7911 [CSP-J 2021] 網路連線

P7911 [CSP-J 2021] 網路連線

洛谷題面

完全出錯位置。。。

題目分析

需要注意的一些事情:

  • 必須要有 \(3\).,要有 \(1\) :

給定一個串,為 a.b.c.d:e

  • \(0\le a,b,c,d\le255,0\le e\le65535\)

  • 數必須要有 \(5\) 個數。

  • 其他字母得爬。

大家總在說什麼 \(STL\) 好用 (事實確實如此),但是在字串的某些處理上 C 語言也有一些優秀之處,比如這道題上。

可以使用 strcmp,sprintf,sscanf

這裡簡要介紹下下:

  • strcmp

基本形式為 \(\rm strcmp(str1,str2)\)

如果返回值小於 \(0\)

,則表示 \(\rm str1\) 小於 \(\rm str2\)

如果返回值大於 \(0\),則表示 \(\rm str1\) 大於 \(\rm str2\)

如果返回值等於 \(0\),則表示 \(\rm str1\) 等於 \(\rm str2\)

  • sscanf

這玩意兒與 scanf 唯一的區別是它是以固定字串為輸入源的。

格式為 sscanf(str,"...",...),表示從字串 \(\rm str\) 讀入。

  • sprintf

這玩意兒與 printf 唯一的區別是它是以固定字串為輸出源的。

格式為 sprintf(str,"...",...),表示把 ""

內的字元輸到指定字串 \(\rm str\) 中。

具體的使用可以自行查閱百度百科。

程式碼

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <cstdio>

#include <climits>//need "INT_MAX","INT_MIN"

#include <map>

#include <string>

#include <cstring>

#define enter() putchar(10)

#define debug(c,que) cerr<<#c<<" = "<<c<<que

#define cek(c) puts(c)

#define blow(arr,st,ed,w) for(register int i=(st);i<=(ed);i++)cout<<arr[i]<<w;

namespace Newstd
{
	inline int read()
	{
		char c;
		bool flag=false;
		while((c=getchar())<'0' || c>'9')
		{
		    if(c=='-') flag=true;
		}
		int res=c-'0';
		while((c=getchar())>='0' && c<='9')
		{
		    res=(res<<3)+(res<<1)+c-'0';
		}
		return flag?-res:res;
	}
	inline void print(int x)
	{
		if(x<0)
		{
			putchar('-');x=-x;
		}
		if(x>9)
		{
			print(x/10);
		}
		putchar(x%10+'0');
	}
}

using namespace Newstd;

using namespace std;

const int MA=105;

int n;

map<string,int>mp;

inline bool chk(int x)
{
	if(x<0 || x>255)
	{
		return true;
	}
	
	return false;
}

inline bool chk(char* str)
{
	int a=-1,b=-1,c=-1,d=-1,e=-1;
	
	int t=sscanf(str,"%d.%d.%d.%d:%d",&a,&b,&c,&d,&e);
	
	if(t!=5)
	{
		return false;
	}
	
	if(chk(a)==true || chk(b)==true || chk(c)==true || chk(d)==true)
	{
		return false;
	}
	
	if(e<0 || e>65535)
	{
		return false;
	}
	
	char tmp[MA];
	
	sprintf(tmp,"%d.%d.%d.%d:%d",a,b,c,d,e);
	
	return strcmp(str,tmp)==false;
}

int main(void)
{
	//freopen("network.in","r",stdin);
	
	//freopen("network.out","w",stdout);
	
	std::ios::sync_with_stdio(false);
	
	cin>>n;
	
	for(register int i=1;i<=n;i++)
	{
		char opt[MA],name[MA];
		
		cin>>opt>>name;
		
		string now=name;
		
		if(opt[0]=='S')
		{
			if(chk(name)==false)
			{
				cout<<"ERR"<<endl;
			}
			
			else if(mp.count(now)!=0)
			{
				cout<<"FAIL"<<endl;
			}
			
			else
			{
				cout<<"OK"<<endl;
				
				mp[now]=i;
			}
		}
		
		else
		{
			if(chk(name)==false)
			{
				cout<<"ERR"<<endl;
			}
			
			else if(mp.count(now)==0)
			{
				cout<<"FAIL"<<endl;
			}
			
			else
			{
				cout<<mp[now]<<endl;
			}
		}
	}
	
	return 0;
}