Luogu p1308 / Vijos p1761 统计单词数
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入输出格式
输入格式:
输入文件名为stat.in ,2 行。
第1 行为一个字符串,其中只含字母,表示给定单词;
第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
输出文件名为stat.out 。
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。
输入输出样例
说明
数据范围
1≤ 单词长度≤10。
1≤ 文章长度≤1,000,000。
noip2011普及组第2题
思路
字符串处理,有点坑。WA了2次才过
代码
1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 5 void stolower(char *); 6 void righttrim(char *); 7 8 int len,wordlen; 9 10 int main() { 11 char word[20]; 12 char a[100]; 13 char c; 14 char *p; 15 int cnt=0,n=0,flag=0,k=-1,flagstart=0; 16 fgets(word,sizeof(word),stdin); 17 if((p = strchr(word,'\n')) != NULL) 18 *p = '\0'; 19 righttrim(word); 20 stolower(word); 21 wordlen=strlen(word); 22 while ((c=getchar())!=EOF) { 23 if ((c==' ' || c=='\n') && flagstart) { 24 a[len]='\0'; 25 stolower(a); 26 if (strcmp(a,word)==0) { 27 if (!flag) { 28 flag=1; 29 k=n; 30 } 31 cnt++; 32 } 33 len=0; 34 } 35 else if (islower(c) || isupper(c)){ 36 if (!flagstart) flagstart=1; 37 a[len]=c; 38 len++; 39 } 40 n++; 41 } 42 if (flag) printf ("%d %d\n",cnt,k-wordlen); 43 else printf ("-1\n"); 44 return 0; 45 } 46 47 void stolower(char *s) { 48 int i,len=strlen(s); 49 for (i=0;i<len;i++) { 50 s[i]=tolower(s[i]); 51 } 52 } 53 54 void righttrim(char *s) { 55 int len=strlen(s); 56 while (s[len-1]==' ') { 57 s[len-1]='\0'; 58 len--; 59 } 60 }