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 丁姐的周末相关推荐

  1. 数据结构与算法 学习笔记(5):字符串

    数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...

  2. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  3. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  4. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  5. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  6. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  7. LMS与RLS算法学习笔记

    LMS与RLS算法学习笔记 一. 研究目的 1.1最陡下降法理论 1.2$LMS$算法 1.3$RLS$算法 1.4研究目标 二.代码解析 三.结果 实现代码点击 这里下载 一. 研究目的 1.1最陡 ...

  8. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  9. Python预测 数据分析与算法 学习笔记(特征工程、时间序列)

    微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...

  10. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

最新文章

  1. 用python的numpy作线性拟合、多项式拟合、对数拟合
  2. 【翻译转载】【官方教程】Asp.Net MVC4入门指南(2):添加一个控制器
  3. Visual Studio 2008 和 .NET 3.5 发布了
  4. 详解PHP spl_autoload_register()函数
  5. 数据结构与算法学习-开篇
  6. 怎么修改_PDF怎么修改文字?其实修改PDF内容很简单
  7. 微信小程序开发-IP地址查询-例子
  8. python 的按位与 或 异或 运算
  9. 【APICloud系列|26】UIScrollPicture 模块(图片轮播)的实现
  10. C语言程序设计基础之联合
  11. 讯飞智能录音笔SR101:考研的温暖陪伴
  12. vim替换字符串带斜杠_Linux vi/vim最全使用指南
  13. java.sql.SQLException: 关闭的连接 解决办法
  14. matlab脑肿瘤识别与分割程序_车牌识别算法
  15. android中prop配置参数名,21.Android系统属性build.prop文件(笔记)
  16. thinkphp3.2独立分组的建立
  17. MTK手机平台充电原理
  18. VARCHART XGantt 甘特图用程序应该如何交付
  19. 低代码应用创新成果——轴承行业数字化智造系统(含MES/ERP/WMS)
  20. 第一次开发EOS区块链的经验总结

热门文章

  1. orocos安装_动脑共享单车环境搭建
  2. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
  3. 进度条Progress的用法介绍
  4. iridescent歌词翻译
  5. (已解决)INSTALL_FAILED_CONFLICTING_PROVIDER虚拟机安装失败错误
  6. 初识AutoIt v3
  7. 圣诞节,教你用Python给微信头像添加一个圣诞帽
  8. WEB云安全技术应用篇
  9. RocketMQ事务消息学习及刨坑过程
  10. Mybatis之错误:Invalid bound statement (not found)