【刷题日记】string练习题两则
[NOIP2011 普及组] 统计单词数(洛谷P1308)
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。
输入格式
共 \(2\) 行。
第 \(1\) 行为一个字符串,其中只含字母,表示给定单词;
第 \(2\) 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 \(0\) 开始);如果单词在文章中没有出现,则直接输出一个整数 \(-1\)。
注意:空格占一个字母位
样例 #1
样例输入 #1
To
to be or not to be is a question
样例输出 #1
2 0
样例 #2
样例输入 #2
to
Did the Ottoman Empire lose its power at that time
样例输出 #2
-1
数据范围
数据范围
$1\leq $ 第一行单词长度 \(\leq10\)。
$1\leq $ 文章长度 \(\leq10^6\)。
noip2011 普及组第 2 题
题解
简单的搜索匹配问题。为了方便比较,将所有字母全部转为小写。为了方便将每个单词与给定单词进行判等,新开一个字符串用于存储单词。
可能用到的代码:
a[5] += 32 //将a的5号元素字符从大写转为小写
a.pushback(c) //将单个字符c添加在a末尾
a.clear() //清空a
AC代码
#include <iostream>
#include <string>
using namespace std;
string a,b,c;
long long all_sum = 0,now_pos = 0,ans_pos = -1;
int main(){
getline(cin,a);
getline(cin,b);
//全部变小写
for(long long i = 0;i<a.size();i++)
if(a[i] >= 'A' && a[i] <= 'Z')
a[i] += 32;
for(long long i = 0;i<b.size();i++)
if(b[i] >= 'A' && b[i] <= 'Z')
b[i] += 32;
//循环搜索
for(long long i = 0;i<b.size();i++){
if(b[i] == ' '){ //如果是空格则结算
if(c == a)
all_sum++;
if(c==a && all_sum == 1)
ans_pos = i-a.size();
c.clear();
}
else{ //否则向c中拷贝
c.push_back(b[i]);
}
}
if(all_sum) printf("%lld ",all_sum);
printf("%lld",ans_pos);
return 0;
}
[NOIP2008 提高组] 笨小猴(洛谷P1125)
题目描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设 \(\text{maxn}\) 是单词中出现次数最多的字母的出现次数,\(\text{minn}\) 是单词中出现次数最少的字母的出现次数,如果 \(\text{maxn}-\text{minn}\) 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。
输入格式
一个单词,其中只可能出现小写字母,并且长度小于 \(100\)。
输出格式
共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word,否则输出 No Answer;
第二行是一个整数,如果输入单词是 Lucky Word,输出 \(\text{maxn}-\text{minn}\) 的值,否则输出 \(0\)。
样例 #1
样例输入 #1
error
样例输出 #1
Lucky Word
2
样例 #2
样例输入 #2
olympic
样例输出 #2
No Answer
0
提示
【输入输出样例 1 解释】
单词 error 中出现最多的字母 \(\texttt r\) 出现了 \(3\) 次,出现次数最少的字母出现了 \(1\) 次,\(3-1=2\),\(2\) 是质数。
【输入输出样例 2 解释】
单词 olympic 中出现最多的字母 \(\texttt i\) 出现了 \(1\) 次,出现次数最少的字母出现了 \(1\) 次,\(1-1=0\),\(0\) 不是质数。
(本处原题面错误已经修正)
noip2008 提高第一题
题解
可以创建一个数组桶,直接统计26个字母各自出现的次数即可。
AC代码
#include <iostream>
#include <cstring>
using namespace std;
string str;
long long num[26],maxn=-1,minn=101;
bool is_prime(long long n){
if(n == 1 || n == 0) return 0;
bool is = 1;
for(long long i = 2;i*i<=n;i++){
if(n % i == 0){
is = 0;
break;
}
}
return is;
}
int main(){
cin>>str;
for(long long i = 0;i<str.size();i++) num[str[i]-'a']++;
for(long long i = 0;i<26;i++){
if(num[i] > maxn) maxn = num[i];
if(num[i] < minn && num[i]) minn = num[i];
}
if(is_prime(maxn - minn))
printf("Lucky Word\n%lld",maxn - minn);
else
printf("No Answer\n0");
return 0;
}

浙公网安备 33010602011771号