摘要
题目链接 |
难度等级 |
完成状态 |
完成分数 |
最后编辑时间 |
失误原因(初次提交分数)
|
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>
题解
按照题目要求一个个判断模拟即可,实现起来也不算太恶心。两点需要注意:
- 可能出现带空格的字符串,要用getline[1];
- 可能出现空Word,空Word不是Word,需要特判[2]。
代码
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;
- }
|
参考资料和拓展阅读
- 跳转 ↑ http://www.cppblog.com/willing/archive/2010/05/11/115108.aspx?opt=admin
- 跳转 ↑ http://acm.sgu.ru/forum_action.php?id=3492