There is a problem in SGU (Problem 274).
Task is writing a simple email-validator.
Valid email address can be described as follows:
[letter] ::= a|b|...|z|A|B|...|Z
[symbol] ::= [letter] |0|1|...|9|_|-
[word] ::= [symbol] | [symbol][word]
[prefix] ::= [word] | [prefix].[word]
[domain] ::= [letter][letter] | [letter][letter][letter]
[suffix] ::= [prefix].[domain]
[address] ::= [prefix]@[suffix]
I'm sure that my validator works correctly but i got wrong answer.
Here is my validator:
Description: First it checks the email address length and position of @. Then it breaks it into maximal parts, Prefix and Suffix and check whether they're valid or not.
bool check(string command, int k, int f, int l)
{
/*
command: it is "prefix" or "suffix"
k: index of the email (There are several email addresses)
f: first of the string
l: end of the string
*/
if(f > l) return false;
if(command == "prefix")
{
for(int i = f ; i <= l ; i++)
{
if(s[k][i]-'A' < 26 && s[k][i]-'A' >= 0) continue;
if(s[k][i]-'a' < 26 && s[k][i]-'a' >= 0) continue;
if(s[k][i]-'0' < 10 && s[k][i]-'0' >= 0) continue;
if(s[k][i] == '-' || s[k][i] == '_') continue;
if(s[k][i] == '.' && i < l && i > f) continue;
return false;
}
return true;
}
if(command == "suffix")
{
if(s[k][l-2] != '.' && s[k][l-3] != '.') return false;
int dot = (s[k][l-2] == '.')? l-2 : l-3;
for(int i = dot+1 ; i <= l ; i++)
{
if(s[k][i]-'A' < 26 && s[k][i]-'A' >= 0) continue;
if(s[k][i]-'a' < 26 && s[k][i]-'a' >= 0) continue;
return false;
}
if(check("prefix", k, f, dot-1)) return true;
return false;
}
}
void solve()
{
int at;
for(int i = 1 ; i <= n ; i++)
{
if(s[i].length() < 6)
continue;
at = 0;
for(int j = 1 ; j < s[i].length()-4 ; j++)
if(s[i][j] == '@')
{
at = j;
break;
}
if(!at) continue;
if(check("prefix", i, 0, at-1) && check("suffix", i, at+1, s[i].length()-1))
ans[i] = true;
}
}
Sample test:
Input
3
abc@abc
abc@abc.abc
_@-.ru
Output
NO
YES
YES