NOIP2011-普及组复赛-第二题-统计单词数

时间:2021-01-16 15:32:23
题目描述 Description
  一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 
  现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
  中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
 输入输出格式 Input/output
输入格式:
  输入文件名为stat.in ,2 行。 
  第1 行为一个字符串,其中只含字母,表示给定单词; 
  第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
  输出文件名为stat.out 。 
  只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。
 输入输出样例 Sample input/output
样例测试点#1
输入样例:

【输入样例1】
To
to be or not to be is a question
【输入样例2】
to
Did the Ottoman Empire lose its power at that time

输出样例:

【输出样例1】
2 0
【输出样例2】
-1

说明 description
数据范围
1≤ 单词长度≤10。 
1≤ 文章长度≤1,000,000。 
noip2011普及组第2题
思路:循环至末尾,遇到空格,判断空格前的单词是否与要找的单词相符,是的话输出位置,否则没找到,输出-1。
代码①如下(本代码来自我的老师:http://www.cnblogs.com/huashanqingzhu/p/4051137.html):
 #include<stdio.h>
#include<string.h>
int main()
{
char s1[],s2[];
int f1;
long first=-,num=;//first:首次出现的下标。num:总共出现的次数
char ch;
int i;
int index=-;//表示当前扫描文章的下标
scanf("%s",s1);
getchar();//吸收回车符
for(i=;s1[i]!='\0';i++)
{
if(s1[i]>='A'&&s1[i]<='Z')//若是大写字母,则变为小写字母
s1[i]=s1[i]+;
}
f1=;//尚未开始输入文章当中的新单词
i=;//从文章输入的字符保存在s2数组当中的下标
while((ch=getchar())!=EOF)//没到结束
{
index++;
if(ch==' ')//空格
{
if(f1==)
{
continue;//跳出循环
}
else
{
s2[i]='\0';//给这里表上末尾
if(strcmp(s1,s2)==)//如果两个一样大
{
if(first==-)
first=index-strlen(s2);
num++;//出现过,num++
}
i=;
f1=;
}
}
else
{
f1=;
if(ch>='A'&&ch<='Z') ch=ch+;
s2[i]=ch;
i++;
}
}
if(num>)//出现过
printf("%d %d\n",num,first);
else printf("-1\n");//没出现过
return ;
}

代码②如下:

 #include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
int i,j,t=,tt=;
char s[],ss[];//文章,单词
freopen("stat.in","r",stdin);
freopen("stat.out","w",stdout);
gets(ss);
gets(s);
for(i=;i<=(strlen(s)-strlen(ss));i++)
{
for(j=;j<=strlen(ss)-;j++)
{
if(toupper(s[j+i])!=toupper(ss[j])) break;//不是一样的,game over!!
if(i>&&s[i-]!=' ') break;//一样的,但后面是空格,不一样,game over!!
}
if(j==strlen(ss)&&(s[j+i]==' '||j+i==strlen(s)))//找到了耶,记录之
{
t++;
if(t==)
{
tt=i;
}
}
}
if(t==) printf("-1\n");//没找到,输出-1
else printf("%d %d\n",t,tt);//找到了,输出单词位置
return ;
}