Ever Dream (ZOJ - 3700,模拟水题)

2024-03-30 14:08
文章标签 模拟 水题 zoj ever dream 3700

本文主要是介绍Ever Dream (ZOJ - 3700,模拟水题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.题目链接:

ZOJ-3700

二.题目大意:

T 组数据.

n 行字符串.

现有操作:将每个单词按照出现次数分组,同组中先按长度从大到小,长度相等时,再按字典序排列.

输出规则:在出现次数 > 1 的组,输出里面最长的单词,如果最长的单词不唯一,则输出最长单词中字典序排倒数第二的字符串.

三.分析:

水题!!!

申请两个 map,一个放每个单词出现次数,另一个放出现一定次数的所有单词(优先队列呀!).

注意:".abc.",这种的要把 "abc" 分离出来(无用字符换成空格用 stringstream 分割即可),缩写算作一个单词.

应该 1A 的,5555. I am so vegetable.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define PI acos(-1.0)
#define ll long long int
using namespace std;struct cmp
{bool operator()(string s1, string s2){if(s1.size() == s2.size())return s1 < s2;return s1.size() < s2.size();}
};bool check(char s)
{if(s >= 'a' && s <= 'z' || s == '\'' || s == ' ')return 1;return 0;
}int main()
{int T;scanf("%d", &T);while(T--){int n;scanf("%d", &n);getchar();map <string, int> cnt;map <int, priority_queue <string, vector <string>, cmp> > mp;vector <string> ans;while(n--){string str;getline(cin, str);int len = str.size();for(int i = 0; i < len; ++i){if(str[i] >= 'A' && str[i] <= 'Z')str[i] += 32;if(!check(str[i]))str[i] = ' ';}stringstream ss;ss << str;while(ss >> str)cnt[str]++;}for(map <string, int> ::iterator iter = cnt.begin(); iter != cnt.end(); ++iter)if(iter->second > 1)mp[iter->second].push(iter->first);for(map <int, priority_queue <string, vector <string>, cmp> > ::iterator iter = mp.begin(); iter != mp.end(); ++iter){priority_queue <string, vector <string>, cmp> q;q = iter->second;if(q.size() == 1)ans.push_back(q.top());else{string s1, s2;s1 = q.top();q.pop();s2 = q.top();if(s1.size() == s2.size())ans.push_back(s2);elseans.push_back(s1);}}int len = ans.size();bool flag = 0;for(int i = len - 1; i >= 0; --i){if(flag)printf(" ");cout << ans[i];flag = 1;}printf("\n");}return 0;
}

 

这篇关于Ever Dream (ZOJ - 3700,模拟水题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861693

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

uva 10055 uva 10071 uva 10300(水题两三道)

情歌两三首,水题两三道。 好久没敲代码了为暑假大作战热热身。 uva 10055 Hashmat the Brave Warrior 求俩数相减。 两个debug的地方,一个是longlong,一个是输入顺序。 代码: #include<stdio.h>int main(){long long a, b;//debugwhile(scanf("%lld%lld", &

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

zoj 4624

题目分析:有两排灯,每排n个,每个灯亮的概率为p,每个灯之间互不影响,亮了的灯不再灭,问两排中,每排有大于等于m个灯亮的概率。 设dp[ i ][ j ]为第一排亮了i个灯,第二排亮了j个灯,距离目标状态的期望天数。显然 i >= m ,j >= m时 , dp[ i ][ j ] = 0 。 状态转移 : 第一排亮了a个灯,a 在[ 0 , n - i] 之间,第二排亮了b个灯 , b 在

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点