E-是不是复读机

题目描述:

在复读纪元2140年,复读机(们)已经放弃了如下所示的低级复读方式:
“哟,小伙汁,想不到你也是个复读机”
“哟,小伙汁,想不到你也是个复读机”
而是进化出了一种新的复读技巧:语义复读,即能复读出字面上高度相似的句子(单词顺序不一定一样)。譬如,在发生以下对话时,我们可以认为,参与对话的两人中存在复读机:
“I am not a repeater”
“I am not a repeater too”
现在我就来教你如何辨认复读机.

  1. 提取出所有的单词,并统计每一句中的词频。
    2.通过余弦相似度算法进行相似度分析。

    我们知道,在二维向量中,假设a向量是(x1, y1),b向量是(x2, y2),那么可以将余弦定理改写成下面的形式:

    将我们之前提取出的词频看成2个n维向量,可得到(1,1,1,1,1,0)和(1,1,1,1,1,1)两个向量,进行余弦计算,可得到

    我们认为其相似度为0.912,当相似度不小于90%时,我们就认为对话的两人中,存在复读机。
输入描述

输入包括两行由数字(0-9)、英文字符(a-z、A-Z)和空格组成的字符串。其中单词之间通过空格分隔且不区分大小写,即我们认为“At”、“at”、“AT”、“aT”为同一个单词。每个字符串总长度不超过2000.

输出描述:

在一行中输出结果,如果存在复读机,则输出“Yes”,否则输出“No”,不包含双引号。

示例1

输入

I am not a reapter
I am not a reapter too

输出

Yes
示例2

输入

Excuse me Can you tell me how much the shirt is
Yes it is nine fifteen

输出

No

思路解析:

知识点复习:substr
/*
string s = “0123456789”;
string sub1 = s.substr(5);一个数字:表示从下标为5开始一直到结尾:
sub1 = “56789”
string sub2 = s.substr(5, 3);从下标为5开始截取长度为3位:
sub2 = “567”
*/
样例中两句话要分别记录每个单词出现的次数,所以可以想到用两个map<string,int>容器去储存单词的次数,并且用set集合(不重复且自动排序的容器)去储存出现过的单词。
最后不用输入原句,所以可以将两句话全部转为大写或小写形式,便于在map映射和set集合中单词的处理。
这道题精髓的地方应该是如何在一串字符串中用substr切割每个单词。

需要使用string中的find函数去找空格
当字符串不为空时,找到第一个空格的下标p,然后用一个新命名的string s变量暂时储存空格前的内容,也就是字符串头到空格下标p之间的内容,用substr(0,p)操作截取一个单词并用set集合中的insert插入到容器,这个string变量的map映射值也将相应加1,再循环以上操作,直到字符串剩下最后一个单词时,再单独特判:s != “” && s != " "

代码:

#include<bits/stdc++.h>
using namespace std;
int main() {string s1, s2, s;getline(cin, s1);getline(cin, s2);set<string> st;map<string, int> mp1, mp2;int i; for (i = 0; i < s1.length(); i++) {if (s1[i] >= 'A' && s1[i] <= 'Z') s1[i] = tolower(s1[i]);}for (i = 0; i < s2.length(); i++) {if (s2[i] >= 'A' && s2[i] <= 'Z') s2[i] = tolower(s2[i]);}int p = s1.find(" ");while (p != string::npos) {s = s1.substr(0, p);st.insert(s);s1 = s1.substr(p+1);mp1[s] += 1;p = s1.find(" ");}if (s1 != "" && s1 != " ") {st.insert(s1);mp1[s1] += 1;}p = s2.find(" ");while (p != string::npos) {s = s2.substr(0, p);st.insert(s);s2 = s2.substr(p+1);mp2[s] += 1;p = s2.find(" ");}if (s2 != "" && s2 != " ") {st.insert(s2);mp2[s2] += 1;}int up = 0, down1=0, down2 = 0;for (set<string>::iterator it = st.begin(); it != st.end(); it++) {up += mp1[*it]*mp2[*it];down1 += mp1[*it]*mp1[*it];down2 += mp2[*it]*mp2[*it];}double sum = up*1.0/(sqrt(down1)*sqrt(down2)*1.0);if (sum >= 0.9000)cout << "Yes";elsecout << "No" ;return 0;
}

(江西财经大学第二届程序设计竞赛同步赛)E-是不是复读机相关推荐

  1. 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)

    链接:https://ac.nowcoder.com/acm/contest/635/H 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  2. 江西财经大学第二届程序设计竞赛同步赛----E-是不是复读机

    首先发出题目链接: 链接:https://ac.nowcoder.com/acm/contest/635/E 来源:牛客网 题目如下: 看完题目之后就有两个问题摆在面前: (1)题目输入的是一串英文, ...

  3. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解

    "科林明伦杯"哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解 萌新又来写题解啦 原题链接 B 减成一 题意:存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多 ...

  4. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛题解

    A,C,I签到题,只搞了8题,还一题是神仙做的,我不会 链接:https://www.nowcoder.com/acm/contest/122/B 来源:牛客网 取石子 时间限制:C/C++ 1秒,其 ...

  5. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 - 题解

    A - ID and password 题目描述 Users prefer simple passwords that are easy to remember, but such passwords ...

  6. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 部分题解

    A-ID and password 签到题. #include <iostream> #include <cstdio> #include <bits/stdc++.h& ...

  7. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛B 取石子(博弈SG函数模板)

    题目链接:取石子 链接:https://www.nowcoder.com/acm/contest/122/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65 ...

  8. 江西财经大学第一届程序设计竞赛 G题小Q的口袋校园

    题目链接:https://www.nowcoder.com/acm/contest/115/G 解题思路:题解就一份代码,贪心的思想.先按开始时间进行排序. 然后不断贪心获得happy[ j ]的最大 ...

  9. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛)---全题目+题解

    文章目录 A.点对最大值 B.减成一 C.面积 D.扔硬币 E.赛马 F.三角形 G.养花 H.直线 I.字典序 J.最大值 A.点对最大值 链接:https://ac.nowcoder.com/ac ...

最新文章

  1. oracle循环插入数据用于测试
  2. 【进展】冰箱运行监测系统:进展汇报,顺理思路
  3. 关于 paddingFactor 及 COLLMOD 的设置值
  4. oracle em 删除 重建,Oracle 11g 重建EM需要删除的对象
  5. Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状...
  6. VS2010在C#头文件添加文件注释的方法
  7. MYSQL  GROUP BY 对多个字段进行分组
  8. [转]DES加密 java与.net可以相互加密解密两种方法
  9. asp.net oracle连接数据库,ASP.NET连接Oracle数据库的步骤详解
  10. java graphics dispose_Graphics.Dispose 方法 (System.Drawing) | Microsoft Docs
  11. Linux文件夹打包拷贝到window下
  12. 海量图标矢量图免费下载【来自阿里】
  13. 立创3D文件转成stp文件应用到AD中
  14. linux下nginx重启命令
  15. sersync+rsync的热备份研究(热备+断点续传)
  16. 【传统CV】Anovel adaptive morphological approach for degraded character image segmentation
  17. 8086CPU结构与功能
  18. Mysql出现问题:ERROR 2058: Plugin caching_sha2_passward could not be loaded解决方案
  19. OLTP和OLAP的区别?
  20. 奥运会数据集分析(部分)

热门文章

  1. POJ-1861-Network 解题报告
  2. vue 手写 移动端 左右滑动 防止上下滑动冲突 超过宽度一半切换
  3. 基于CSS3实现元素宽度向两侧延伸
  4. jQuery源码研究学习笔记(二)
  5. 7-227 寻找大富翁 (25 分)
  6. JavaWeb项目实战(2)安装JDK和Tomcat以及Eclipse构造开发环境
  7. js list操作_使用 Node.js 实现一个命令行 todo-list(1)- 基本功能
  8. 最经典的Linux入门命令
  9. java 末级递归树_如何递归获取json里末级章节名称
  10. UVA - 820 Internet Bandwidth(最大流模板题)