测试点13,17,18,19,20,21wa了
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,st,sd,sm;
long long num;
bool f,q;
string op,ad;
map<string,int>m;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>op>>ad;
if(ad.size()>21||ad.size()<9){
cout<<"ERR"<<endl;
continue;
}
num=0;st=0;sd=0;sm=0;q=0;
for(int j=0;j<ad.size();j++){
if(!q&&ad[j]=='0'&&ad[j+1]>'0'&&ad[j+1]<'9'&&j+1!=ad.size()){//注意末尾0是可行的(注意我到底想填可行还是不可行的条件);修改后要再编译一遍,并查一遍所有样例;排除可行(优先排除较为简单的)的就是不可行的(可行与不可行之间不要有重复
f=1;break;
}
else if(((!st||st>4)&&ad[j]=='.')||(st!=4&&ad[j]==':')){//小心‘.’在‘:’后面
f=1;break;
}
else if(num>65535){
f=1;break;
}
else if(ad[j]=='.'||ad[j]==':'){
if(ad[j]=='.')sd++;
else sm++;
if(ad[j+1]>='0'&&ad[j+1]<='9')st++;
if(num>255){
f=1;break;
}
num=0;
q=0;
}
else if(ad[j]>='0'&&ad[j]<='9'){
if(!st)st=1;
q=1;
num=num*10+ad[j]-'0';
}
else{//确保全面性:不合法的情况都是非法的
f=1;break;
}
}//要关注开头第一个字符的状态+一个数字开头是零有可能是因为它本身就是0
if(ad[0]<'0'||ad[0]>'9'||ad[ad.size()-1]<'0'||ad[ad.size()-1]>'9'||num>65535||st!=5||sd!=3||sm!=1)f=1;
if(f){
f=0;
cout<<"ERR"<<endl;
continue;
}
if(op=="Server"){
if(!m[ad]){
m[ad]=i;
cout<<"OK"<<endl;
continue;
}
else {
cout<<"FAIL"<<endl;
continue;
}
}
else{
if(!m[ad]){
cout<<"FAIL"<<endl;
continue;
}
else{
cout<<m[ad]<<endl;
}
}
}
}