题面
本题有两个考点
1:判断地址串是否合法
没有什么技巧,按照说明一条条判断即可,大样例3几乎包含了所以情况了
调出来基本就过了
2:判断服务器是否存在及编号
可以直接用字符串哈希,或者直接用
map
\text{map}
map即可
code:
#include<bits/stdc++.h>
using namespace std;
long long N,A[5],B[5],C[5],All_Num;
string str[5];
map<string,long long>maps;
bool check(string s){
A[0]=A[1]=A[2]=A[3]=A[4]=0;
B[0]=B[1]=B[2]=B[3]=B[4]=0;
C[0]=C[1]=C[2]=C[3]=C[4]=0;
long long x=0,y=0,num=0;
for(int i=0;i<s.size();i++){
if(s[i]=='.'){
if(x>=3||y==1||C[num]==0){
return 0;
}
x++;num++;
}
else if(s[i]==':'){
if(x!=3||y==1||C[num]==0){
return 0;
}
y++;num++;
}
else{
if(B[num])return 0;
A[num]=(A[num]<<3)+(A[num]<<1)+s[i]-48;
if(s[i]==48&&A[num]==0)B[num]=1;C[num]=1;
if(A[num]>1000000)return 0;
}
}
if(s[s.size()-1]==':'||s[0]=='.')return 0;
if(x!=3||y!=1)return 0;
for(int i=0;i<4;i++){if(A[i]<0||A[i]>255){return 0;}}
if(A[4]<0||A[4]>65535){return 0;}
return 1;
}
int main(){
freopen("network.in","r",stdin);
freopen("network.out","w",stdout);
scanf("%lld",&N);
for(int i=1;i<=N;i++){
cin>>str[0]>>str[1];
if(!check(str[1]))printf("ERR\n");
else{
if(str[0][0]=='S'){
if(maps[str[1]]){
printf("FAIL\n");
}
else{
maps[str[1]]=i;
printf("OK\n");
}
}
else{
if(maps[str[1]]){
printf("%lld\n",maps[str[1]]);
}
else{
printf("FAIL\n");
}
}
}
}
return 0;
}