洛谷 U85684 读单词
题目背景
由于一些特殊心理的影响,SeawaySeaway主动请缨担任了英语课代表,主要负责班级的课前单词领读工作。
题目描述
SeawaySeaway在领读单词的时候有一个癖好:因为SeawaySeaway是一个极迷信的人,他固执地认为,如果一个单词中出现次数最多的字母出现的次数为质数,但出现次数最少的字母出现的次数不为质数,或者出现次数最少的字母出现的次数为质数,但出现次数最多的字母出现的次数不为质数,那么这个词就是个“好词”,一定要读!如果一个单词中出现次数最多和最少的字母出现的次数都为质数,那么这个词就是个“坏词”,一定不能读!如果一个单词中出现次数最多和最少的字母出现的次数都不为质数,那么这个词就是个“中性词”,读不读看SeawaySeaway心情好坏。但是领读要快速,留给SeawaySeaway判断这个词到底是“好词”、“坏词”还是“中性词”的时间太短了,所以他需要你编写一个程序,帮他确定一个词到底应不应该读。
输入格式
输入文件的第一行包含一串长度为NN的字符,表示SeawaySeaway要读的单词。
输出格式
输出文件只有一行。如果这个单词应该读,就输出“Read it!”,如果不应该读就输出“Shut up!”,如果是“中性词”,就输出“Remember her!”。
输入输出样例
输入 #1 复制
seaway
输出 #1 复制
Read it!
输入 #2 复制
love
输出 #2 复制
Remember her!
输入 #3 复制
roselee
输出 #3 复制
Read it!
说明/提示
数据范围:(NN为字符串长度)
1 \le N \le 10^71≤N≤10
7
输入保证单词全部为小写
题解:
这题改编自(笨小猴),考点是字符串模拟,因为英文一共只有26个字母,我们完全可以新建一个数组(只有30那么大)来保存从\(a\)到\(z\)的每个字母出现的次数,最后进行排序和判断即可。
有了这个思路,我们就可以进行代码实现,但是难点是,怎么建立一个由字母到数组下标的映射?
原理很简单。我们应该知道,C++中的每一个字符都对应一个ASCII码,如果我们做字符的“运算”,那么实际上就是这个ASCII码在进行运算,最后把算出来的值再映射回字符。也就是说,我们只需要把输入进去的每一个字母进行ASCII码的操作,最后就能把它返回成整数。
怎么操作呢?我们把每个字母减去\(a\)对应的ASCII码,再加一(自己想一想为什么要加一),就可以转换成\(1-26\)的数组下标了。
最后是排序和判断。
这道题排序是一个坑点,一不小心就容易马虎,如果我们直接从大到小排并取头尾元素的话,会出现取出的最小元素是0的情况(当这个最小元素没有出现过的情况下),这个时候就需要我们循环处理,排完序之后先枚举,碰到第一个不为0的数,再记录下来。
最后的判断没什么难点,细心一点就好了。但是在这里我还想多说几句,就是这个判断(素数判断另写函数)可以不用写的很长,我们发现最后写出来的判断函数只会返回两个值:\(0,1\)。那么我们就可以对两次判断返回的值进行逻辑运算(位运算)。如果两次都是1,就直接输出是,如果两次都是0,就直接输出否,否则就都输出中性词。
当然,这是拓展知识,有兴趣的同学可以通过这篇博客学习基础的位运算。
代码:
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=1e7+1; int minn,maxx; char s[maxn]; int tot[30]; bool check(int x) { if(x==0 || x==1) return 0; for(int i=2;i<=sqrt(x);i++) if(x%i==0) return 0; return 1; } int main() { //freopen("#10.in","r",stdin); //freopen("#10.out","w",stdout); scanf("%s",s+1); int len=strlen(s+1); for(int i=1;i<=len;i++) tot[s[i]-'a'+1]++; sort(tot+1,tot+27); for(int i=1;i<=27;i++) if(tot[i]!=0) { minn=tot[i]; break; } maxx=tot[26]; if(check(minn)&check(maxx)==1) { printf("Shut up!"); return 0; } else if(check(minn)|check(maxx)==0) { printf("Remember her!"); return 0; } else { printf("Read it!"); return 0; } }