[2016-05-04][codeforces][666A - Reberland Linguistics]

  • 时间:2016-05-04 16:51:34 星期三

  • 题目编号:[2016-05-04][codeforces][666A - Reberland Linguistics]

  • 题目大意:一个单词由长度不少于5的词根和长度为2或3的若干个后缀组成,并且两个相邻的后缀不能一样,给定一个单词,问这个单词总共可以有多少个后缀

  • 分析:

    • 类似dp 的思想,dp[i] 表示第i个位置到字符串结束能否划分成合法后缀,
    • 那么dp[i] = dp[i +t] ∧ ( dp[i + 5] ∨ 子串(i,t) != 子串 (i + t , t)); t == 2 或 3
    • 即,从后往前扫,每增加一个字符,就判断由它开始的长度为2 和 3的后缀 和剩下部分 组成的后缀 是否合法
    • 新后缀是否合法,
      • 使用这个后缀后,剩下部分仍然能正常分割成2 或 3的若干个后缀
      • 这个后缀和下一个那个后缀不一样(只要存在不一样的分法就可以)
        • 这个后缀和下一个后缀长度一样:直接比较
        • 长度不一样,显然成立,但是要在往前数5位剩下的能合法分割,即dp[I+ 5]为真的情况才行
  • 遇到的问题:

    • 判断当前后缀和下一个后缀是否一样的时候,如果用子串来比较的话,刚开始的时候,i + 2 > 长度 的时候会出错
    • 解决办法是,不生成子串,而是通过find函数,来查找下一个和它相同的字符串的位置
    • 初始化 dp[长度] = 0;
  1. #include<iostream>
  2. #include<string>
  3. #include<set>
  4. #include<cstring>
  5. using namespace std;
  6. set<string> s;
  7. const int maxn = 1E4 + 10 ;
  8. int dp[maxn];
  9. int main(){
  10. string str;
  11. cin>>str;
  12. memset(dp,0,sizeof(dp));
  13. str = str.substr(5);
  14. int n = str.length();
  15. string tmp;
  16. dp[n] = 1;
  17. for(int i = n - 1; i >= 0 ; --i){
  18. for(int l = 2 ; l <= 3 ; ++l){
  19. tmp = str.substr(i, l);
  20. if(( str.find(tmp,i + l) != i + l || dp[i + 5] ) && dp[i + l] ){
  21. s.insert(tmp);
  22. dp[i] = 1;
  23. }
  24. }
  25. }
  26. cout<<s.size()<<"\n";
  27. for(set<string>::iterator its = s.begin(); its != s.end();++its){
  28. cout<<*its<<"\n";
  29. }
  30. return 0;
  31. }

来自为知笔记(Wiz)

时间: 2024-10-06 16:25:55

[2016-05-04][codeforces][666A - Reberland Linguistics]的相关文章

2016/05/04(反射)

反射:重点----每天都用反射,但是每天都不写反射     Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性. 使用反射可以获得Java类中各个成员的名称并显示出来.简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术. 反射的作用? 可以通过反射机制发现对象的类型,发现类型的方法/属性/构造器? 可以创建对象并访问任意对象方法和属性等 主要点:运行时探究和使用编译时未知的类 Dog d1 = new

CodeForces 667C Reberland Linguistics

#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include&

Codeforces Round #349 (Div. 2) C. Reberland Linguistics DP+set

C. Reberland Linguistics First-rate specialists graduate from Berland State Institute of Peace and Friendship. You are one of the most talented students in this university. The education is not easy because you need to have fundamental knowledge in d

2016年04月MVP开始申请了~[截止时间:1月12日]

51CTO与微软中国合作长期为用户提供申请"微软最有价值专家"的平台希望有兴趣.资历的朋友以及正在朝这个方向努力的朋友能够积极参与只要您想参与我们将为您向微软推荐 微软最有价值专家MVP一年评选4次分别为每年的1月.4月.7月.10月.2016年4月的MVP申请截止时间是2016年1月12日. 申请MVP的午饭请下载2016年4月MVP申请表填好后发送到[email protected].我们会在每次MVP申请开始时把用户提交的申请表格推荐到微软中国相关部门 [注意事项]1.51CTO

2016年04月29日【EPM-易通元】最新价位公布

2016年04月29日[EPM-易通元]最新价位公布   涨了.涨了.又涨了!   我们的「EPM易通元」天天见涨!太给力了!!   2016.04.29日今天已涨0,01美金,目前已到0.35美金啦!   如果你有1000个易通元,你今天就收益10美金   如果你有10000个易通元,今天就收益100美金   如果你有100000个易通元,你今天就收益1000美金.   恭喜买到「EPM易通元」的朋友们,买到即是赚到!   买入210美金到3500美金 :1美金:6.3人民币兑换,举例买入35

Codeforces Round #349 (Div. 2) C. Reberland Linguistics 【DP】

/* *********************************************** Author :Maltub Email :[email protected] Blog :htttp://www.xiang578.com ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #inclu

2016.05互金平台移动端影响力50强榜单报告!

(文章来源:盈灿咨询) 6月21日下午,盈灿咨询在京举办互金平台移动端影响力报告暨2015网贷蓝皮书出版发布会,首次独家发布了<互金平台移动端影响力榜单TOP50>,北京大学汇丰商学院中小企业研究中心执行主任王家卓.网贷之家首席研究员&盈灿咨询总经理马骏.盈灿咨询副总经理于百程.爱钱进CEO杨帆等嘉宾出席了本次活动并做主题分享. 据悉,该报告选取了300余家互金平台5月的移动端数据,以平台在移动端的推广目的和移动互联网特点为支点,以指标.评分.分析为撬棍,展示了目前行业内互金平台的移动

分布式技术一周技术动态 2016.05.29

分布式系统实践 1. 网易视频云:新一代列式存储格式Parquet的最佳实践 https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650755579&idx=1&sn=640c55c7f2800be48271cdfb1880be99&scene=0&key=8d8120cb97983fad266c6ac303c9142a6b1da8ee51bea2e187dba1380070fd7707bdef8da1404

2016年04月30日【EPM-易通元】最新价位公布

涨了.涨了.又涨了! 我们的「EPM易通元」天天见涨!太给力了!! 2016.04.30日今天早晨已涨0.01美金,目前已到0.37美金啦!如果你有1000个易通元,你今天就收益10美金 如果你有10000个易通元,今天就收益100美金 如果你有100000个易通元,你今天就收益1000美金 如果你有1000000个易通元,你今天就收益10000美金. 恭喜买到「EPM易通元」的朋友们,买到即是赚到! 买入210美金到3500美金 :1美金:6.3人民币兑换,举例买入3500美金(人民币2205