CloudLunar
主页
知识库
人文社科
自然科学
跨学科领域
热门分类
算法及题库
云璟月's
墨色集(设计)
指尖集(代码)
未央集(随笔)
流觞集(语录)
如花集(书影)
纸鸢集(小说)
登录
B站
微博
人人
开心
Twitter
Facebook
RSS订阅链接
留言板
关于我
在社交网站上关注我
B站
微博
人人
开心
Twitter
Facebook
RSS订阅
RSS订阅链接
留言板
关于我
查看CodeForces/412E的源代码
←
CodeForces/412E
因为以下原因,你没有权限编辑本页:
你刚才请求的操作只对属于该用户组的用户开放:
用户
您可以查看并复制此页面的源代码:
[[分类:字符串处理]][[分类:组合数学]] ==摘要== {{信息题|E-mail Addresses|http://acm.hust.edu.cn/vjudge/contest/view.action?cid{{=}}70594#problem/H|2|100|数据类型|0|time=2015-02-24 12:42:17}} *来自寒假练习:[http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70594 2015 Winter Day 1 div1] H题 *原题链接:http://codeforces.com/problemset/problem/412/E ==题意== 给一个字符串,找出其子串中是E-mail的。 ==题解== *复杂度肯定要求O(n)的,不能暴力枚举判断。写这题的时候,有一种状态机<ref>{{维基百科|有限状态机}}</ref>的感觉。按照题目定义,一个Email应该满足: {字母序列1+字母、数字、'_'}+{‘@’+字母数字+‘.’}+{字母序列2} *三个{...}看作状态a1,a2,a3,每个状态都有进入条件(开头字符+已经处于前一个状态),扫一遍字符串,每个字符分别判断它属于哪个状态。 【default】 --[有字母开头]--> 【a1】 --[碰到'@']--> 【a2】 --[碰到'.']-->【a3】 ↑ ┃ ┃ ┃ | [非字母、数字、'_'] [非字母数字] [非字母] └--------------------------┻---- ---------------┻----------------- ┛ *在a3状态统计 字母序列1长度*字母序列2长度 即可。 ==代码== {{折叠|412E.cpp代码已折叠 |<pre> #include<cstdio> #include<iostream> #include<string> using namespace std; #define dsi(n) int n;scanf("%d",&n) #define si(n) scanf("%d",&n) #define f(i,n) for(int i=1;i<=n;++i) #define fi(n) f(i,n) #define f0(i,n) for(int i=0;i!=n;++i) #define fd(i,n) for(int i=n;i>=1;--i) #define ci const int& #define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i) #define c(x) const x& class st { int x,y; friend bool operator <(const st&a,const st&b){return a.x<b.x;} }; string s; unsigned long long a1=0,a2=0,a3=0,p1=0,p2=0,ans=0;//fixed数据类型// int main() { //[{字母+字母数字_}+{@+字母数字+.}+{字母}// //a1->a2->a3// cin>>s; foreach(i,s) { //a3continue; if(a3) { if(isalpha(*i)) { ++a3; if(a3>=2) { ans+=p1; //cout<<"[]"; } } else a3=0; } //a3in// if(a2>=2/*fixed:>=2而非>0*/&&*i=='.') a3=1; //a2continue// if(!isalnum(*i)&&a2) a2=0; if(isalnum(*i)&&a2) ++a2; //a2in// if(*i=='@'&&a1) ++a2,p1=p2; //a1continue// if(isalpha(*i)&&a1) ++p2; if((isalnum(*i)||*i=='_')&&a1) ++a1; else a1=0,p2=0; //a1in// if(isalpha(*i)&&a1==0) ++a1,++p2; //cout<<*i<<" "<<a1<<" "<<a2<<" "<<a3<<" "<<p1<<endl; } cout<<ans; return 0; } </pre> |code412E}} ==参考资料和拓展阅读== <references/>
该页面使用的模板:
模板:=
(
查看源代码
)
模板:信息题
(
查看源代码
)
模板:折叠
(
查看源代码
)
模板:维基百科
(
查看源代码
)
返回
CodeForces/412E
。
著作权声明
[
编辑
]
除非另有说明,本
网站内容
采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可(中国大陆可以参照
知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
,如有不同以前者为准)。
如果需要商业化使用,请另联系作者取得授权。
关于
[
编辑
]
联系
@云璟月Lunar
的新浪微博
本站RSS:
RSS链接