南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
问题 A: 变位词
时间限制: 2 Sec 内存限制: 10 MB
提交: 322 解决: 59
提交 状态 算法问答
题目描述
请大家在做oj题之前,仔细阅读关于抄袭的说明http://www.bigoh.net/JudgeOnline/.
变位词是指由相同的字母组成的单词,如eat、tea是变位词。本次问题给出一串单词,你需要找到所有的变位词。
输入
输入由两行组成:第一行是所有单词的总数,第二行是由空格分隔的单词列表。两行末尾都有空格。
注:为防歧义,输入的单词都是小写
输出
这次需要大家先输出一个字符串,它是“我已阅读关于抄袭的说明”的汉语拼音.输出此行的提交我们将认为已经完全阅读并了解了“关于抄袭的说明”公告.
第二行是变位词组的个数,后面是所有的变位词。每个输出的变位词占一行。一组变位词只需要输出一个字典序最小的代表即可,如eat、tea中eat字典序小于tea,所以输出eat。变位词与变位词也按照字典序从小到大排列,如eat和el中eat字典序小于el所以eat在el前面。
输出的每一行最后都没有空格。
样例输入9 |
样例输出wo yi yue du guan yu chao xi de shuo ming |
提示
使用代价为O(nlgn)的方法。
代码
复杂度要达到nlogn,读入输入字符串是n复杂度,就是说插入部分为logn的复杂度,肯定就是使用树结构,c++中map使用平衡二叉树实现,可以直接使用。
int main()
{
int len = ;
cin >> len;
/*
第一个string代表sort(temp.begin(), temp.end()),这是为了把变位词聚集在一起
第二个string代表一个变位词集合中最小的元素
第三个int代表出现次数
*/
map<string, pair<string,int>> m;
int result = ;
string temp;
for (int i = ; i < len; i++) {
cin >> temp;
string orgin = temp;
sort(temp.begin(), temp.end());
m[temp].second++;
if (m[temp].second == )
m[temp].first = orgin;
else if (m[temp].second >= ) {
if (orgin < m[temp].first)
m[temp].first = orgin;
if(m[temp].second == )
result++;
}
} cout << "wo yi yue du guan yu chao xi de shuo ming" << endl;
cout << result << endl;
vector<string> v;
v.reserve(result);
for (auto k = m.begin(); k!=m.end() ; k++) {
if ((*k).second.second >= )
v.emplace_back((*k).second.first);
}
//m是使用string内部字符排序后的值作为索引,还要排个序
sort(v.begin(), v.end());
for (auto q = v.begin(); q != v.end(); q++)
cout << *q << endl; return ;
}
问题 B: 三数之和
时间限制: 1 Sec 内存限制: 2 MB
提交: 113 解决: 56
提交 状态 算法问答
题目描述
输入
数组长度,以及要求的三数之和;
没有重复元素的数组。
输出
已阅读抄袭的说明;
所有triple的个数。
样例输入6 3 |
样例输出wo yi yue du guan yu chao xi de shuo ming |
提示
代码
题目没有重复元素,简便了一些,先排序,然后确定一个元素的位置,剩下两个元素采用两边逼近的方式来求。可以见Leetcode15,3 sum问题,比这个稍微复杂一点,思路完全相同
int main()
{
int len = ;
int sum = ;
cin >> len;
cin >> sum;
vector<int> v;
v.reserve(len);
int temp;
for (int i = ; i < len; i++) {
cin >> temp;
v.emplace_back(temp);
}
sort(v.begin(), v.end());
int times = ;
for (int i = ; i < len - ; i++) {
int pos2 = i + ;
int pos3 = len - ;
while (pos2 < pos3) {
if (v[i] + v[pos2] + v[pos3] < sum) {
pos2++;
}else if(v[i] + v[pos2] + v[pos3] > sum){
pos3--;
}else {
times++;
pos2++;
}
}
}
cout << "wo yi yue du guan yu chao xi de shuo ming" << endl;
cout << times << endl; return ;
}
南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和的更多相关文章
- 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数
问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...
- 南大算法设计与分析课程OJ答案代码(3)
问题 A: 动态中位数问题 时间限制: 1 Sec 内存限制: 8 MB提交: 866 解决: 102提交 状态 算法问答 题目描述 输入一组整数a1, a2, …, an ,每输入一个整数,输出 ...
- 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题
问题 A: 割点与桥 时间限制: 1 Sec 内存限制: 5 MB提交: 475 解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如果点 ...
- 南大算法设计与分析课程OJ答案代码(2)最大子序列和问题、所有的逆序对
问题 A: 最大子序列和问题 时间限制: 1 Sec 内存限制: 4 MB提交: 184 解决: 66提交 状态 算法问答 题目描述 给定一整数序列 a1, a2, …, an,求 a1~an 的 ...
- 南大算法设计与分析课程复习笔记(1) L1 - Model of computation
一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种“抽象的机器”之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合 ...
- 南大算法设计与分析课程复习笔记(4)L4 - QuickSort
一.快速排序 算法导论上关于快速排序有两种写法 第一种,从头到尾遍历,不断将小于基准元素的项移到前面.代码很简介,只需要维护一个交换位置,表示小于基准元素的末尾位置加一 我们看算法导论上的一个例子: ...
- 南大算法设计与分析课程复习笔记(3)L3 - Recursion
一.递归方程 按照分治的思想,可以将一个递归的复杂度写成递归方程 一.解递归方程--猜然后证明 该方法又称为代入法,步骤如下: 1.猜解的形式 2.数学归纳法证明正确 例子: 我们假设有如下递归式: ...
- 南大算法设计与分析课程复习笔记(2)L2 - Asymptotics
一.几种比较复杂度的符号 数据结构有描述,相关严格数学定义也不想说了,就这么过了吧. 二.最大子数组的几种解决方法 从最复杂的暴力解法过渡到最简单的动态规划 解析和代码见这里:http://www.c ...
- 算法设计与分析 - AC 题目 - 第 5 弹(重复第 2 弹)
PTA-算法设计与分析-AC原题 - 最大子列和问题 (20分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+, ..., Nj },其中 ≤i ...
随机推荐
- python 特别的生成器表达式
Ⅰ起因 学习python的同学通常会遇到这样一道经典生成器测试题: def gen(): for i in range(4): yield i base = gen() for n in (2,10) ...
- javaWeb中MVC的编程思想示例
没有学习MVC之前我只写了一个Servlet类(Note_List.java),分层之后,我将这个类分成了5个类(NoteDao.java,,NoteDaoImpl.java,,NoteService ...
- Redis-01.初探
官网 http://redis.io 中文网 http://redis.cn 命令参考 http://redisdoc.cn Redis(Remote Dictionary Server)是一个开源的 ...
- python 分片、截断序列
200 ? "200px" : this.width)!important;} --> 介绍 这篇文章主要介绍python对序列的分片方法.通过分片规则可以很简单的处理一些复 ...
- Hadoop 倒排索引
倒排索引是文档检索系统中最常用的数据结构,被广泛地应用于全文搜索引擎.它主要是用来存储某个单词(或词组)在一个文档或一组文档中存储位置的映射,即提供了一种根据内容来查找文档的方式.由于不是根据文档来确 ...
- 致我们再也回不去的 Github ...
本文原文来自公众号 stormzhang,原作者自称“二流学校毕业.非科班出身.从 0 自学编程到现在的「段子张」”. 1.前言 相信大家都知道了,微软已确认要收购 GitHub 了,Github ...
- 从零开始单排学设计模式「策略模式」黑铁 II
阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了, ...
- MySQL分布式事物(XA事物)的使用
有时一个系统的数据 放在不同的库之中.如果用普通的事物 一个分支库提交成功了,另外一个分支库提交失败了, 这候 两个库没有同步的成功或者失败.会导致系统数据的不完整. 对于处理这种情况 MySQL有了 ...
- 一句话的事儿,Head first 设计模式
head first 设计模式,是比较有趣的一本设计模式的书. 在学校里看书和在工作时看书,意义是不一样的.在学校时是为读书而读书,我们可以从0到1,我们有的是时间.但是工作后就不一样. 我觉得这时的 ...
- 软件测试人员需要掌握的linux命令(二)
2 设备管理 2.1 mount 名称 : mount 使用权限 : 系统管理者或/etc/fstab中允许的使用者 使用方式 : mount [-hV] mount [-fnrsvw] [-t vf ...