noip2011普及组——统计单词数
统计单词数
时间限制:1 s
内存限制:128MB
【问题描述】
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位
置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章
中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,
即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),
如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
【输入】
输入文件名为stat.in,2行。
第1行为一个字符串,其中只含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
【输出】
输出文件名为stat.out。
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,
分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字
母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。
输入输出样例1
输入:
To
to be or not to be is a question
输出:
2 0
【输入输出样例1说明】
输出结果表示给定的单词To在文章中出现两次,第一次出现的位置为0。
输入输出样例2
输入:
to
Did the Ottoman Empire lose its power at that time
输出:
-1
【输入输出样例2说明】
表示给定的单词to在文章中没有出现,输出整数-1。
【数据范围】
1≤单词长度≤10。
1≤文章长度≤1,000,000。
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char s1[100],s2[1000]; 6 int f1; 7 long first=-1,num=0;//first:首次出现的下标。num:总共出现的次数 8 char ch; 9 int i; 10 int index=-1;//表示当前扫描文章的下标 11 12 freopen("stat2.in","r",stdin); 13 freopen("stat2.txt","w",stdout); 14 15 scanf("%s",s1); 16 getchar();//吸收回车符 17 for(i=0;s1[i]!='\0';i++) 18 { 19 if(s1[i]>='A'&&s1[i]<='Z')//若是大写字母,则变为小写字母 20 s1[i]=s1[i]+32; 21 } 22 23 f1=0;//尚未开始输入文章当中的新单词 24 i=0;//从文章输入的字符保存在s2数组当中的下标 25 while((ch=getchar())!=EOF) 26 { 27 index++; 28 if(ch==' ') 29 { 30 if(f1==0) { continue; } 31 else 32 { 33 s2[i]='\0'; 34 if(strcmp(s1,s2)==0) 35 { 36 if(first==-1) 37 first=index-strlen(s2); 38 num++; 39 } 40 i=0; 41 f1=0; 42 } 43 } 44 else 45 { 46 f1=1; 47 if(ch>='A'&&ch<='Z') ch=ch+32; 48 s2[i]=ch; 49 i++; 50 } 51 } 52 if(num>0) 53 printf("%d %d\n",num,first); 54 else printf("-1\n"); 55 return 0; 56 }