请你们在作oj题以前,仔细阅读关于抄袭的说明http://www.bigoh.net/JudgeOnline/. php
变位词是指由相同的字母组成的单词,如eat、tea是变位词。本次问题给出一串单词,你须要找到全部的变位词。 c++
请你们在作oj题以前,仔细阅读关于抄袭的说明http://www.bigoh.net/JudgeOnline/. php
变位词是指由相同的字母组成的单词,如eat、tea是变位词。本次问题给出一串单词,你须要找到全部的变位词。 c++
输入由两行组成:第一行是全部单词的总数,第二行是由空格分隔的单词列表。两行末尾都有空格。 算法
注:为防歧义,输入的单词都是小写 数组
此次须要你们先输出一个字符串,它是“我已阅读关于抄袭的说明”的汉语拼音.输出此行的提交咱们将认为已经彻底阅读并了解了“关于抄袭的说明”公告. spa
第二行是变位词组的个数,后面是全部的变位词。每一个输出的变位词占一行。一组变位词只须要输出一个字典序最小的表明便可,如eat、tea中eat字典序小于tea,因此输出eat。变位词与变位词也按照字典序从小到大排列,如eat和el中eat字典序小于el因此eat在el前面。 .net
输出的每一行最后都没有空格。 code
样例输入9 a ew vc tea oe eat zoo el le |
样例输出wo yi yue du guan yu chao xi de shuo ming 2 eat el |
使用代价为O(nlgn)的方法。blog
复杂度要达到nlogn,读入输入字符串是n复杂度,就是说插入部分为logn的复杂度,确定就是使用树结构,c++中map使用平衡二叉树实现,能够直接使用。排序
int main() { int len = 0; cin >> len; /* 第一个string表明sort(temp.begin(), temp.end()),这是为了把变位词汇集在一块儿 第二个string表明一个变位词集合中最小的元素 第三个int表明出现次数 */ map<string, pair<string,int>> m; int result = 0; string temp; for (int i = 0; i < len; i++) { cin >> temp; string orgin = temp; sort(temp.begin(), temp.end()); m[temp].second++; if (m[temp].second == 1) m[temp].first = orgin; else if (m[temp].second >= 2) { if (orgin < m[temp].first) m[temp].first = orgin; if(m[temp].second == 2) 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 >= 2) 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 0; }
数组长度,以及要求的三数之和; 索引
没有重复元素的数组。
已阅读抄袭的说明;
全部triple的个数。
样例输入6 3 8 0 -5 -2 6 -1 |
样例输出wo yi yue du guan yu chao xi de shuo ming 2 |
题目没有重复元素,简便了一些,先排序,而后肯定一个元素的位置,剩下两个元素采用两边逼近的方式来求。能够见Leetcode15,3 sum问题,比这个稍微复杂一点,思路彻底相同
int main() { int len = 0; int sum = 0; cin >> len; cin >> sum; vector<int> v; v.reserve(len); int temp; for (int i = 0; i < len; i++) { cin >> temp; v.emplace_back(temp); } sort(v.begin(), v.end()); int times = 0; for (int i = 0; i < len - 2; i++) { int pos2 = i + 1; int pos3 = len - 1; 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 0; }