题目描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
输入格式
一个单词,其中只可能出现小写字母,并且长度小于100100。
输出格式
共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出00。
输入输出样例
输入
error
输出
Lucky Word
2
输入
olympic
输出
No Answer
0
解题思路:
法一:
用map容器,map<char,int >m,那么m数组就相当于m[char] = int,举个例子,如果我们用普通数组来计算,我们定义a[1] = 1表示意思是1出现了1次,那么a[1] = 3,就是a出现了3次,那么map容器,m[a] = 3,就是a出现了3次。
法一:
代码如下:
#include <iostream>
#include <map>
#include <cmath>
using namespace std;bool check(int x) {if (x == 0 || x == 1)return false;for (int i = 2; i <= sqrt(x); i++) {if (x % i == 0)return false;}return true;
}int main() {map<char, int>m;string a;cin >> a;int maxs = 0;int mins = 1000;for (int i = 0; i < a.length(); i++) {m[a[i]]++;//这里的a[i]是char型,所以就跟我们上面例子一样.}for (int i = 0; i < a.length(); i++) {maxs = max(maxs, m[a[i]]);mins = min(mins, m[a[i]]);}if (check(maxs - mins)) {cout << "Lucky Word" << endl;cout << maxs - mins << endl;} else {cout << "No Answer" << endl;cout << "0" << endl;}return 0;
}
不过,写代码时我们要注意,不要写成这样:
#include <iostream>
#include <map>
#include <cmath>
using namespace std;bool check(int x) {if (x == 0 || x == 1)return false;for (int i = 2; i <= sqrt(x); i++) {if (x % i == 0)return false;}return true;
}int main() {map<char, int>m;string a;cin >> a;int maxs = 0;int mins = 1000;for (int i = 0; i < a.length(); i++) {m[a[i]]++;//这里的a[i]是char型,所以就跟我们上面例子一样.maxs = max(maxs, m[a[i]]);mins = min(mins, m[a[i]]);}if (check(maxs - mins)) {cout << "Lucky Word" << endl;cout << maxs - mins << endl;} else {cout << "No Answer" << endl;cout << "0" << endl;}return 0;
}
原因就是,如果我们一边遍历一边比较大小,那么比如aabbbb,第一次a出现的次数是1,一比较,最小值就是1,后面再出现a,a变成了2,可是比较的话,最小值还是1,所以我们一边遍历一边比较,就会导致最小值出错。
解题思路:
法二:
我们直接遍历字符串,统计每个字母出现了几次,然后找出最大值,最小值就好了,可是在我们计算最小值的时候,因为没出现过的字母是0,一定比那些出现过的值小,所以我们计算最小值会被干扰,我们用vis数组标记,只比较出现过的字母出现的次数就好了。
法二:
代码如下:
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 110;
bool vis[N];
int cnt[N];bool check(int x) {if (x == 0 || x == 1)return false;for (int i = 2; i <= sqrt(x); i++) {if (x % i == 0)return false;}return true;
}int main() {string a;cin >> a;for (int i = 0; i < a.length(); i++) {cnt[a[i] - 'a' + 1]++;vis[a[i] - 'a' + 1] = true;}int maxs = 0;int mins = 1000;for (int i = 1; i <= 26; i++) {if (vis[i]) {maxs = max(maxs, cnt[i]);mins = min(mins, cnt[i]);}}if (check(maxs - mins)) {cout << "Lucky Word" << endl;cout << maxs - mins << endl;} else {cout << "No Answer" << endl;cout << "0" << endl;}return 0;}