题目链接 : https://www.luogu.com.cn/problem/P1308
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入格式
共22行。
第11行为一个字符串,其中只含字母,表示给定单词;
第22行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从00 开始);如果单词在文章中没有出现,则直接输出一个整数-1−1。
输入输出样例
输入
To
to be or not to be is a question
输出
2 0
输入
to
Did the Ottoman Empire lose its power at that time
输出
-1
说明/提示
数据范围
1≤ 1≤单词长度≤10≤10。
1≤ 1≤文章长度≤1,000,000≤1,000,000。
noip2011普及组第2题
思路:本土想听过输入时通过判断空格来京一篇文章的每一个单词用一个一维数组表示,这样整篇文章证可以用二维数组来表示,结果当后台测试数据为:
输入
u
tIXHUguyz PZYAJL BIv NAPoemaJ aTF LOvhV m s LSa n xDn mQnO T ettIq T AL fG B Xme t fct U tQ d
输出
1 92
代码输出结果出现了错误。(好奇,为什么u是第92个单词)
源代码`
#include
#include
#include
#include
char wen[1000000][15], yangli[15];
int ans, ans1 = -1;
void strlower (char *a) {
for(int i = 0; a[i]; i ++ ) {
if(isupper(a[i])) a[i] = tolower(a[i]);
}
}
int main()
{
int flag1 = 1, flag = 0;
int i = 0, j = 0;
gets(yangli);
while((scanf("%c",&wen[i][j])!=EOF)){
if(wen[i][j] == ' '){
i++;
j = 0;
continue;
}
if(wen[i][j] == '\n')break;
j++;
}
strlower(yangli);
int m;
m = strlen(yangli);
for(int j = 0; j <= i; j++) strlower(wen[j]);
for(int j = 0; j <= i; j++){
flag1 = 1;
int n;
n = strlen(wen[j]) - 1;
if(m != n) continue;
for(int k = 0; k <= m - 1; k++){
if(yangli[k] != wen[j][k]){
flag1 = 0;
break;
}
}
if(flag1 == 1){
ans++;
flag = 1;
if(ans1 == -1 ) ans1 = j;
}
}
if(flag == 1) printf("%d %d",ans,ans1);
else printf("-1");
}
题解代码:
#include
#include
#include
void strlower (char *a) {
//手写函数,将大写字母转换成小写字母
for(int i = 0; a[i]; i ++ ) {
if(isupper(a[i])) a[i] = tolower(a[i]);//isupper是判断是否是大写字母的系统函数,tolower是将其转换成小写字母的函数
}
}
int main () {
char destination[1000001], *q, source[11], *p;//destintion是要找的文章,source是要找的单词,p和q都是指针类,分别代表当前搜索到什么地方了和最后一次找到单词的指针
bool flag = false;//判断是否找到了
int ans = 0, ans1 = -1;//个数和首次出现的位置,ans1的初值是-1是因为在没找到的时候就直接输出就行了,省事
gets(source);
gets(destination);//输入
strlower(destination);//全部转换成小写字母
strlower(source);
int len = strlen(source);//长度,在后面防止越界和加快速度
p = destination;//先将指针设为全部
for(; q = strstr(p, source); ) {
//循环,strstr是在一个字符串里面给定一个字符串,寻找有没有这个字符串,若有,返回首次出现的指针否则返回NULL(空指针)
if( q != NULL//找到了
&& ( q == destination || *(q - 1) == ' ') //第一个条件是防止越界,第二个是判断前一个是不是空格
&& ( *(q + len) == '\0' || *(q + len) == ' ' ) ) {
//如果后面也是空格
ans ++ ;//答案加一
if(flag == false) {
//如果是首次找到
flag = true;
ans1 = q - destination;//第一个位置
}
}
p = q + len;//刷新指针
}
if(flag == true)//找到了
printf("%d %d" , ans, ans1);//输出
else
printf("%d", ans1);//输出-1
return 0;
}
引用代码链接:https://www.luogu.com.cn/problemnew/solution/P1308