【算法学习笔记】50.字符串处理 SJTU OJ 1361 丁姐的周末
Description
丁姐来到了神秘的M78星云,为了成为和凹凸曼一样强大的男人有朝一日回到地球拯救世界,丁姐开始了刻苦的学习。但丁姐先要知道在M78星云上一周有多少天,这样他才能知道什么时候是周末可以带妹子出去玩。他找到一个老凹凸曼,但是老凹凸曼自己记性不太好,偶尔会告诉他错误的信息。
凹凸曼会告诉丁姐如下格式的信息:
Today is xxxday.
Yesterday was yyyend.
Tomorrow will be zzzday.
规则1: xxx/yyy/zzz为任意字符串,以day结尾的单词代表工作日,以end结尾的单词代表周末。
规则2: Today is xxxxx. 总是正确的。
规则3: Yesterday was xxxxx. 是正确的,当且仅当在上文中出现过xxxxx。
规则4: Tomorrow will be xxxxx. 是正确的,当且仅当在下文中出现过xxxxx。
规则5: xxxxx被认为是合法的一天,当且仅当至少有一句包含xxxxx的信息是正确的。
请你帮丁姐计算出在M78星云上一周有几天?周末有几天?
Input Format
第1行,一个数字n,表示总共有n条信息。
第2到n+1行,一条具体的信息。
Output Format
两个整数A和B,表示一周共有A天,周末有B天。
Sample Input
6
Today is sunday. // 工作日
Yesterday was friday. // 错误
Tomorrow will be ksnsend. // 错误
Yesterday was friday. // 工作日
Today is tuesdayend. // 周末
Yesterday was sunday. // 工作日,重复
Sample Output
3 1
Limit
n <= 1000
50%测试数据只有Today
思路很简单。就是很麻烦,条件很多容易出错。尤其是判断前后文的问题,要考虑字符串包含的特殊情况。
#include <iostream> #include <cstdio> #define MaxN 1000+10 using namespace std;int day_len = 0;//存储day的个数 int end_len = 0;//存储end的个数 string ori[MaxN];//存数输入的原话 string inputs[MaxN];//存数day和end的名字 具体类型 用type存储int weekdays[MaxN];//存储的是确定第i个day所用的是第几句话 int weekends[MaxN];//存储的是确定第i个end所用的是第几句话int inputs_type[MaxN]; //存储每个输入的类型 0是day 1是endint n;//一共有n句话//判断是否在j之前出现过test bool occur_formor(string test,int j,int type){for (int i = 1; i < j; ++i){if(test == inputs[i] and type == inputs_type[i])return true;}return false; }//判断是否在j之后出现过test bool occur_post(string test,int j,int type){if(type==1)test += "end";elsetest += "day";for (int i = j+1; i <= n; ++i){if(ori[i]=="Today is "+test+".")return true;if(ori[i]=="Yesterday was "+test+".")return true;if(ori[i]=="Tomorrow will be "+test+".") return true;}return false; }//判断是否出现过test+day bool have_in_weekday(string test){for (int i = 0; i < day_len; ++i) //遍历所有的确定过的day {int id = weekdays[i];//得到确定那个day的inputs的编号if(inputs[id] == test and inputs_type[id]==0)return true;}return false; } //判断是否出现过test+end bool have_in_weekend(string test){for (int i = 0; i < end_len; ++i){int id = weekends[i];if(inputs[id] == test and inputs_type[id]==1)return true;}return false; }//尝试加入一个数i是句子编号 xxx是天的名字 type是种类 void add(int type, string xxx,int i){if(type==1 and !have_in_weekend(xxx)){weekends[end_len++] = i;}else if(type==0 and !have_in_weekday(xxx)){weekdays[day_len++] = i;}return; }string getXXX(string s,string seg){int start = s.find(seg)+seg.size(); return s.substr(start, s.size()-4-start); }int main(int argc, char const *argv[]) {cin>>n;getchar();//去除回车//存储原始输入 以便处理"下文" 的条件for (int i = 1; i <= n; ++i){getline(cin,ori[i]);}//开始处理输入for (int i = 1; i <= n; ++i){string& s = ori[i]; //根据前5个字符来判断输入的是今天 昨天 明天string flag = s.substr(0,5);//flag用于判断是哪种输入string xxx;//day或者end的名字int type;//记录 1是end 0是day//根据倒数第二个字符来判断输入天的类型if(s[s.size()-2]=='d')//xxxend.type = 1;//end是1elsetype = 0;//day是0//如果说的是今天if(flag=="Today"){xxx = getXXX(s,"Today is ");add(type,xxx,i);}else if(flag=="Yeste"){xxx = getXXX(s,"Yesterday was ");if(occur_formor(xxx,i,type))//如果前文提到过 add(type,xxx,i);}else if(flag =="Tomor"){xxx = getXXX(s,"Tomorrow will be ");if(occur_post(xxx,i,type))//如果后文提到过 add(type,xxx,i);}inputs_type[i] = type;inputs[i] = xxx;}cout<<end_len + day_len<<" "<<end_len<<endl;return 0; }/* 6 Today is sunday. Yesterday was friday. Tomorrow will be ksnsend. Yesterday was friday. Today is tuesdayend. Yesterday was sunday.2 Tomorrow will endday. Today is enddayday.*/
转载于:https://www.cnblogs.com/yuchenlin/p/sjtu_oj_1361.html
【算法学习笔记】50.字符串处理 SJTU OJ 1361 丁姐的周末相关推荐
- 数据结构与算法 学习笔记(5):字符串
数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...
- 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列
(为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...
- Python最优化算法学习笔记(Gurobi)
微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- 算法学习笔记:对指定金额计算最少钞票数
算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...
- 数据结构与算法学习笔记——链栈
数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...
- LMS与RLS算法学习笔记
LMS与RLS算法学习笔记 一. 研究目的 1.1最陡下降法理论 1.2$LMS$算法 1.3$RLS$算法 1.4研究目标 二.代码解析 三.结果 实现代码点击 这里下载 一. 研究目的 1.1最陡 ...
- 数据结构与算法学习笔记4:递归+分治法
数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...
- Python预测 数据分析与算法 学习笔记(特征工程、时间序列)
微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...
- 数据结构与算法学习笔记——图 C++实现
数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...
最新文章
- 用python的numpy作线性拟合、多项式拟合、对数拟合
- 【翻译转载】【官方教程】Asp.Net MVC4入门指南(2):添加一个控制器
- Visual Studio 2008 和 .NET 3.5 发布了
- 详解PHP spl_autoload_register()函数
- 数据结构与算法学习-开篇
- 怎么修改_PDF怎么修改文字?其实修改PDF内容很简单
- 微信小程序开发-IP地址查询-例子
- python 的按位与 或 异或 运算
- 【APICloud系列|26】UIScrollPicture 模块(图片轮播)的实现
- C语言程序设计基础之联合
- 讯飞智能录音笔SR101:考研的温暖陪伴
- vim替换字符串带斜杠_Linux vi/vim最全使用指南
- java.sql.SQLException: 关闭的连接 解决办法
- matlab脑肿瘤识别与分割程序_车牌识别算法
- android中prop配置参数名,21.Android系统属性build.prop文件(笔记)
- thinkphp3.2独立分组的建立
- MTK手机平台充电原理
- VARCHART XGantt 甘特图用程序应该如何交付
- 低代码应用创新成果——轴承行业数字化智造系统(含MES/ERP/WMS)
- 第一次开发EOS区块链的经验总结
热门文章
- orocos安装_动脑共享单车环境搭建
- PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
- 进度条Progress的用法介绍
- iridescent歌词翻译
- (已解决)INSTALL_FAILED_CONFLICTING_PROVIDER虚拟机安装失败错误
- 初识AutoIt v3
- 圣诞节,教你用Python给微信头像添加一个圣诞帽
- WEB云安全技术应用篇
- RocketMQ事务消息学习及刨坑过程
- Mybatis之错误:Invalid bound statement (not found)