USACO Training Section 3.1 Contact

P2724 联系 Contact

题目背景

奶牛们开始对用射电望远镜扫描牧场外的宇宙感兴趣。最近,他们注意到了一种非常奇怪的脉冲调制微波从星系的中央发射出来。他们希望知道电波是否是被某些地外生命发射出来的,还是仅仅是普通的的星星发出的

题目描述

帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相。他们在寻找长度在A到B之间(包含A和B本身)在每天的数据文件中重复得最多的比特序列 (1 <= A <= B <= 12)。他们在找那些重复得最多的比特序列。一个输入限制告诉你应输出多少频率最多的序列。

符合的序列可能会重叠,并且至少出现一次的序列会被计数

输入输出格式

输入格式:

第一行: 三个用空格分隔的整数: A, B, N; (1 <= N < 50)

第二行及以后: 一个最多200,000字符的序列,全是0或1; 每行字符数不大于80。

输出格式:

输出N个频率最高的序列(按照频率由高到低的次序)。由短到长排列频率相同的这些序列,如果长短相同,按二进制大小排列。如果出现的序列个数小于N,输出存在的序列。

对于每个存在的频率,先输出单独包含该频率的一行,再输出以空格分隔的这些序列。每行六个(除非剩下的少于六个)。

输入输出样例

输入样例#1:

2 4 10
01010010010001000111101100001010011001111000010010011110010000000

输出样例#1:

23
00
15
01 10
12
100
11
11 000 001
10
010
8
0100
7
0010 1001
6
111 0000
5
011 110 1000
4
0001 0011 1100

说明

在样例里,序列100出现了12次,而序列1000出现了5次。次数最多的序列是00,出现了23次。

题目翻译来自NOCOW。

USACO Training Section 3.1

分析

比较容易想到的部分是使用一个数组来保存对应的串的数量。当然,这道题当中,运用map来做,是比较方便的。以字符串为形式保存的01串作为键值来保存出现频率。
每次读入一个新的字符,然后以这个字符为结尾向前反向找符合条件的字符串,进行统计。
统计完成之后,对于统计数组按照题目要求进行排序。(首先按照频率,然后按照长度,最后按字典序)
输出是本题的一大难点(当然也是USACO比赛一向都是这么坑人),题目对于输出有诸多要求。
首先,没输出6个串就要换行(谁知道为什么),那么我们用一个变量LCount来计算当前行的串的个数。
其次,USACO对于换行要求比NOIP也高得多,不允许多换行,也不能少换行。题目当中有几个坑点,我提交以后才发现,比如,上一行如果已经满了6个串,那么已经进行了换行,那么接下来输出就不能再多换行了(Line74)。
还有,输出前要首先判断当前频率和上一次输出频率是否相同,相同的话继续输出,否则换行重新输出。
输出条件和坑点还有很多,自己写的时候多多注意。

程序

 1 #include <bits/stdc++.h>
 2 #define LL unsigned long long
 3 using namespace std;
 4 map<string,int> s;
 5 int a,b,n,i,j,k,len,ls,LCount;
 6 char ch;
 7 char c[5000000];
 8 struct node
 9 {
10     string Str;
11     int Freq;
12 }Ar[100100];
13 int cmp(node x,node y)
14 {
15     if (x.Freq > y.Freq)
16         return 1;
17     if (x.Freq == y.Freq)
18     {
19         if (x.Str.size()<y.Str.size())
20             return 1;
21         if (x.Str.size()==y.Str.size()&&x.Str<y.Str)
22             return 1;
23         return 0;
24     }
25     return 0;
26 }
27 int main()
28 {
29     freopen("contact.in","r",stdin);
30     freopen("contact.out","w",stdout);
31     cin >> a >> b >> n;
32     while ((ch = getchar()) != EOF)
33     {
34         if (ch == ‘1‘ || ch == ‘0‘)
35         {
36             len++;
37             c[len]=ch;
38             string S="";
39             int B = max(len+1-b, 1); //一定要比1大
40             for (i = len; i >= B; i--)
41             {
42                 S = c[i] + S;
43                 if (len-i+1 >= a)
44                 {
45                     if (s[S] == 0)
46                     {
47                         ls++;
48                         s[S] = ls;
49                         Ar[s[S]].Str=S;
50                     }
51                     Ar[s[S]].Freq++;
52                 }
53             }
54         }
55     }
56     sort(Ar+1,Ar+(ls+1),cmp);
57     for (i = 1; i <= ls; i++)
58     {
59         if (n == 0 && Ar[i].Freq != Ar[i-1].Freq)
60             break;
61         if (Ar[i].Freq == Ar[i-1].Freq)
62         {
63             if (LCount % 6 == 0)
64                 cout << Ar[i].Str;
65             else
66                 cout << " " << Ar[i].Str;
67             LCount++;
68             if (LCount % 6 == 0)
69                 cout << endl;
70         }
71         else
72         {
73             n--;
74             if (i != 1 && LCount%6!=0)
75                 printf("\n"); //出现之前相同频率的串,如果是6的倍数,结尾就换行了,在此就不用再换行了。
76             printf("%d\n", Ar[i].Freq);
77             cout << Ar[i].Str;
78             LCount=1;
79         }
80     }
81     if (LCount%6!=0)
82         printf("\n");
83     return 0;
84 }

原文地址:https://www.cnblogs.com/OIerPrime/p/8848247.html

时间: 2024-10-08 08:29:21

USACO Training Section 3.1 Contact的相关文章

LuoGu 1200 你的飞碟在这儿 &amp;&amp; USACO Training Section 1.1_1

描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用 一种聪明的方案让这些小组提前知道谁会被彗星带走.他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给 这些彗星取的名字呢?).关于如何搭配的细节会在下面告诉你:你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带 走. 小组名和彗星名都以下列方式转换成一个数字:最终的数字

LuoGu 1201 贪婪的送礼者 &amp;&amp; USACO Training Section 1.1_2

描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人. 然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱. 给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表, 请确定每个人收到的比送出的钱多的数目. 格式 PROGRAM NAME: gift1 INPUT FORMAT: (f

LuoGu 1202 黑色星期五 &amp;&amp; USACO Training Section 1.1_3

描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的 一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400. 注意,开始今年是一千九百年,不是1990 这里有一些你要知道的: 1.1900年1月1日是星期一. 2.4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天. 3.年份可以被4整除的为闰年(

最小生成树基础模板题(USACO Training Section 3.1 最短网络 Agri-Net)

农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000 输入格式: 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的

USACO Training Section 3.3 Shopping Offers

拿给出的每种方案作为一种物品其他的单卖的物品也作为一种物品 拿它们去跑背包就行 注意编号对应上就行 代码: #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cctype> #include <cstdio> #include <locale> #include <map> using

USACO Training完结感想

USACO Training在历经几年时间后终于被我刷完了.其实我很早就已经刷完了,只不过一直拖到今天才发完blog.真是怠惰呢~~~~~ USACO绝对是我成长的记录者,它看着我,从当初初出茅庐的小子一步步走到今天.虽然不能说是什么大犇,但是也是有一定实力的选手. USACO一共有6章.从简易到困难,从整体上来说这个题库不算难.是一个适合新手锻炼的地方.当然里面也有很多比较经典的题目. 它一直陪伴着我的成长,正如一只COW一样哺育了我. 如果完成前3章已经可以在NOIP中得到不错的成绩了,但是

USACO(含training section)水题合集[5/未完待续]

(1) USACO2.1 Ordered Fractions 枚举 排序即可,注意1/1 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=165,L=1e5; struct fr{ int a,b; fr(int q=0,int w=1):a(q),b(w){} }f[L]; int n,cnt

USACO 之 Section 2.1 (已解决)

The Castle: /* 搜索 1A*/ 1 /* 2 ID: Jming 3 PROG: castle 4 LANG: C++ 5 */ 6 #include <iostream> 7 #include <fstream> 8 #include <sstream> 9 #include <cstdlib> 10 #include <cstdio> 11 #include <cstddef> 12 #include <ite

USACO Training Section3.1 Score Inflation

我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数.你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大.输入包括竞赛的时间,M(1 <= M <= 10,000)和N,"种类"的数目1 <= N <= 10,000.后面的每一行将包括两个整数来描述一个"种类": 第一个