题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
---|---|---|---|---|---|
Spam-filter | ★☆☆☆☆ | 答案正确 | 100 | 2015-2-22 19:22:37 | 特殊情况(1) |
(AC 1026)
判断一个字符串是否是Email地址。一个Email地址格式满足:
<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>
按照题目要求一个个判断模拟即可,实现起来也不算太恶心。两点需要注意:
274.cpp代码已折叠
展开折叠内容
|
---|
#include<cstdio> #include<string> #include<iostream> #include<algorithm> using namespace std; #define si(n) scanf("%d",&n) #define ci const int & #define dsi(n) int n;si(n) #define f(i,n) for(int i=1;i<=n;++i) #define fi(i,p,n) for(int i=p;i<=n;++i) #define fd(i,n) for(int i=n;i!=0;--i) #define fdi(i,p,n) for(int i=n;i>=p;--i) #define ipt const string &s bool isSymbol(ipt)//<symbol> ::= <letter>|0|1|...|9|_|-////<letter> ::= a|b|...|z|A|B|...|Z// { if(s.size()>1)return 0; return isalnum(s[0])||s[0]=='_'||s[0]=='-'; } bool isWord(ipt)//<word> ::= <symbol>|<symbol><word>// { if(!s.size())return 0;//fixed:空Word特判// if(isSymbol(s))return 1; string syb=s.substr(0,1),wd=s.substr(1); return isSymbol(syb)&&isWord(wd); } bool isPrefix(ipt)//<prefix> ::= <word>|<prefix>.<word>// { if(isWord(s))return 1; int t=s.rfind('.'); if(t==string::npos)return 0; string pfx=s.substr(0,t),wd=s.substr(t+1); return isPrefix(pfx)&&isWord(wd); } bool isDomain(ipt)//<domain> ::= <letter><letter>|<letter><letter><letter>// { if(s.size()<2||s.size()>3)return 0; for(int i=0;i!=s.size();++i) if(!isalpha(s[i])) return 0; return 1; } bool isSuffix(ipt)//<suffix> ::= <prefix>.<domain>// { int t=s.rfind('.'); if(t==string::npos)return 0; string pfx=s.substr(0,t),dmn=s.substr(t+1); return isPrefix(pfx)&&isDomain(dmn); } bool isEmail(ipt)//<address> ::= <prefix>@<suffix>// { int t=s.rfind('@'); if(t==string::npos)return 0; string pfx=s.substr(0,t),sfx=s.substr(t+1); return isPrefix(pfx)&&isSuffix(sfx); } int main() { int n; scanf("%d\n",&n); while(n--) { string s; getline(cin,s); cout<<(isEmail(s)?"YES":"NO")<<endl; } return 0; } |