UVA 10789 题解

Prime Frequency

Given a string containing only alpha-numerals (0-9,
A-Z and a-z) you have to count the frequency (the
number of times the character is present) of all the
characters and report only those characters whose fre-
quency is a prime number. A prime number is a num-
ber, which is divisible by exactly two different integers.
Some examples of prime numbers are 2, 3, 5, 7, 11 etc.
Input
The rst line of the input is an integer T (0 < T < 201)
that indicates how many sets of inputs are there. Each
of the next T lines contains a single set of input.
The input of each test set is a string consisting
alpha-numerals only. The length of this string is positive and less than 2001.
Output
For each set of input produce one line of output. This line contains the serial of output followed by the
characters whose frequency in the input string is a prime number. These characters are to be sorted in
lexicographically ascending order. Here \lexicographically ascending" means ascending in terms of the
ASCII values. Look at the output for sample input for details. If none of the character frequency is a
prime number, you should print `empty‘ (without the quotes) instead.
Sample Input
3
ABCC
AABBBBDDDDD
ABCDFFFF
Sample Output
Case 1: C
Case 2: AD
Case 3: empty

题意:输入T表示样例个数,接下来T行每行输入一个字符串(含大小写字母,数字),然后记录每一个字符的出现个数,最后把出现个数为素数的字符按ASCII码值由小到大排序。

分析:用map和素数筛

AC code:

#include<bits/stdc++.h>
using namespace std;
char s[2005];
bool u[2005];
char ans[2005];
map<char,int>    book;
map<char,int>::iterator it;
void ass()
{
    memset(u,true,sizeof(u));
    u[0]=u[1]=false;
    for(int i=2;i<=2100;i++)
    {
        if(u[i])
        {
            for(int j=2;j<=2100;j++)
            {
                if(i*j>2100)    break;
                u[i*j]=false;
            }
        }
    }
}
int main()
{
    //freopen("input.txt","r",stdin);
    int t;
    ass();
    scanf("%d",&t);
    int k=0;
    while(t--)
    {
        scanf("%s",s);
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            book[s[i]]++;
        }
        int num=0;
        for(it=book.begin();it!=book.end();it++)
        {
            if(u[it->second])
            {
                ans[num++]=it->first;
            }
        }
        if(num!=0)
        {
            sort(ans,ans+num);
            printf("Case %d: ",++k);
            for(int i=0;i<num;i++)
            {
                printf("%c",ans[i]);
            }
            printf("\n");
        }
        else printf("Case %d: empty\n",++k);
        book.clear();
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/cautx/p/11427605.html

时间: 2024-11-03 16:47:07

UVA 10789 题解的相关文章

【OI】计算分子量 Molar mass UVa 1586 题解

题目:(由于UVa注册不了,还是用vjudge) https://vjudge.net/problem/UVA-1586 详细说明放在了注释里面.原创. 破题点在于对于一个元素的组合(元素+个数),只有3种可能: 1.单个元素 2.一个元素和一位数字 3.一个元素和两位数字 没有了.因为题设交代了n<=99,表明个数只能为2位数.分别判断即可. /* Copyright 2019 AlexanderZ.Tang Molar_mass.cpp For UVa 1586 https://cnblog

1 UVA 10789 Prime Frequency

先筛素数,再统计给定字符的出现频率. #include<cstdio> #include<cstring> using namespace std; bool pri[2010]; char s[2010]; void init() { int i,j; memset(pri,1,sizeof pri); pri[0]=pri[1]=0; for(i=2;i<=2000;i++) { if(!pri[i]) continue; for(j=i+i;j<=2000;j+=

写给自己----大学过半之后(三)

其实早就想写这篇文章了,不过暑假的时候一直懒得动笔.现在都已经做了一个星期的大三狗了,想想也是时候把这第三篇文章给写了. 首先来说说这个刚刚过去的暑假吧.本来这个暑假应该是取校ACM队参加集训的,但是最终还是选择去实验室实习了一个月.其实ACM一直是我非常喜欢的,博文的绝大部分也都是UVA的题解.不过为什么最终还是没有去ACM队集训呢,我想可能我有点害怕了.因为ACM队暑期训练的强度还是非常大的,基本上整个暑假都在刷题,然后想想还有个数据结构的课设要做,也挺想回家的(其实知道回家挺无聊的,但不知

优质题表(机密版)

转载请注明出处:http://www.cnblogs.com/dashuzhilin/p/4556803.html 思维题: poj 1528 poj 1597 poj 2538 poj 2608 poj 2612 poj 2361 poj 2339 poj 2664 uva 10894 uva 10921   uva 10922   uva 10929 uva 10931   uva 10800   uva 10878 uva 10976   uva 10323   uva 201 poj 2

UVa 1329 - Corporative Network Union Find题解

UVa的题目好多,本题是数据结构的运用,就是Union Find并查集的运用.主要使用路径压缩.甚至不需要合并树了,因为没有重复的连线和修改单亲节点的操作. 郁闷的就是不太熟悉这个Oj系统,居然使用库中的abs就会WA,自己写了个abs小函数就过了. 题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4075 #include <s

UVa - 457 - Linear Cellular Automata 题解

本题大概题意: 给出一个数组DNA,包含10个数值,如:DNA[10] = {0,1,2,3,,1,2,3,0,1,2}所有数值应该不大于3. 给出一行40个字符的字符串: 空格代表0, '.'代表1,'x'代表2,'W'代表3. 相邻三个数值(或两个数值)相加得到的数作为DNA的下标,然后取DNA数组改下标的数值为新的值.产生新的字符串. 好难说清楚,看原文吧,的确是很难理解的题目: http://uva.onlinejudge.org/index.php?option=com_onlinej

UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解

刘汝佳的题目,悲剧文本 -_-||| 这里使用vector<string>容器倒置记录数据,然后从后面输出就可以了. 难度就是不知道这样的文档到底哪里是开始输出,故此使用动态管理内存的容器比较好做. 增加了io处理的O(n)算法也没有上榜,郁闷. #include <stdio.h> #include <vector> #include <string> using std::vector; using std::string; const int MAX_

UVa 127 - &quot;Accordian&quot; Patience POJ 1214 链表题解

UVa和POJ都有这道题. 不同的是UVa要求区分单复数,而POJ不要求. 使用STL做会比较简单,这里纯粹使用指针做了,非常麻烦的指针操作,一不小心就错.调试起来还是非常费力的 本题理解起来也是挺费力的,要搞清楚如何模拟也不容易啊,读题要很仔细. 纯指针的操作挺快的吧.不过POJ 0ms,而UVa就0.2左右了. 三相链表: 1 只要有叠起来的牌,那么就使用一个down指针指向下面的牌就可以了. 2 使用双向链表,可以方便前后遍历. 3 记得有了更新牌之后,又要重新开始检查是否需要更新牌,这是

UVa 10152 - ShellSort 题解

按他的方法排序,每次移动一个数到顶点,排成需要的序列. Problem D: ShellSort He made each turtle stand on another one's back And he piled them all up in a nine-turtle stack. And then Yertle climbed up. He sat down on the pile. What a wonderful view! He could see 'most a mile! T