zcmu|1750: 统计单词数(某个单词出现次数)

zcmu:
1750: 统计单词数
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 379 Solved: 74
[Submit][Status][Web Board]
Description
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即单词必须与文章中某一独立残次在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
Input
输入文件共2行。
第1行为一个字符串,其中只包含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
Output
只有1行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。
Sample Input
To
to be or not to be is a question
to
Did the Ottoman Empire lose its power at that time
Sample Output
2 0
-1
HINT
1<=单词长度<=10。
1<=文章长度<=10,000,000。
NOIP2011 普及组 stat
Source
NOIP2011
AC_code:

#include #include char a[10000005],b[15]; void CharLower(char* a,int s,int e) { for(int i = s; i < e; i++) { if(a[i]>='A'&&a[i]<='Z') a[i] = a[i]+32; } } int main() { memset(b,'\0',sizeof(b)); while(gets(b+1)) { b[0] = ' '; int lenth_b = strlen(b); b[lenth_b] = ' '; memset(a,'\0',sizeof(a)); gets(a+1); a[0] = ' '; int lenth_a = strlen(a); a[lenth_a] = ' '; CharLower(b,1,lenth_b); CharLower(a,1,lenth_a); int flag = 1,pos,sum = 0; char *p = a,*q = b,*start = NULL; while(start=strstr(p,q)) { sum++; if(flag) { pos = start - a; flag = 0; } p = start+1; } if(sum) printf("%d %d\n",sum,pos); else printf("-1\n"); memset(b,'\0',sizeof(b)); } return 0; }

【zcmu|1750: 统计单词数(某个单词出现次数)】/*
总结:
对于独立残次的单词匹配,可以对子串和母串前后各加一个空格进行匹配。
如果前后不加空格,strstr满足不了这个条件:单词必须与文章中某一独立残次在不区分大小写的情况下完全相同
就是下面这个图的结果:
*/
zcmu|1750: 统计单词数(某个单词出现次数)
文章图片

下面是我第一次做的,用strncasecmp不知道为什么是Wrong:
(想知道原因ing)
code:
#include #include char a[10000005],b[15],c[15]; int main() { memset(b,'\0',sizeof(b)); while(gets(b)) { memset(a,'\0',sizeof(a)); gets(a); int sum = 0,k,lenth_b = strlen(b),pos,flag = 1; for(int i = 0; a[i]!='\0'; i+=k) { k = 0; memset(c,'\0',sizeof(c)); for(int j = i; a[j]!=' '&&a[j]!='\0'; j++) { c[k++] = a[j]; } if(k==lenth_b&&strncasecmp(b,c,lenth_b)==0) { sum++; if(flag) { pos = i; flag = 0; } } k++; } if(sum) printf("%d %d\n",sum,pos); else printf("-1\n"); memset(b,'\0',sizeof(b)); } return 0; }

    推荐阅读