题解 P1308 【统计单词数】

· · 题解

读取部分

c 版本的字符串处理确实比较不友好。

读取部分代码如下:

    // input
    scanf("%s", w);
    c = getchar();
    while((c = getchar()) != EOF && i < MAX_LINE){  
        if(c == '\n') break;
        s[i++] = c;
    } s[i] = '\0';

处理部分

处理部分比较简单,考虑周全一点即可。

处理部分代码:

    // calculate
    for(i=0,j=0; s[i]!='\0'; ++i){
        if((i==0 || s[i-1]==' ' || j) && val(s[i])==val(w[j]) && ++j>-1){
            if(w[j]=='\0' && (s[i+1]=='\0' || s[i+1]==' ')){
                if(first==-1) first = i+1-j;
                count++;
            }
        }else j=0;
    }

AC代码

#include <stdio.h>

#define MAX_LINE 1000001
#define val(a) (a<'a' ? (a-'A'+'a') : a)

int main()
{
    // declaration
    int i=0, j, count=0, first=-1;
    char c, w[11], s[MAX_LINE];

    // input
    scanf("%s", w);
    c = getchar();
    while((c = getchar()) != EOF && i < MAX_LINE){  
        if(c == '\n') break;
        s[i++] = c;
    } s[i] = '\0';

    // calculate
    for(i=0,j=0; s[i]!='\0'; ++i){
        if((i==0 || s[i-1]==' ' || j) && val(s[i])==val(w[j]) && ++j>-1){
            if(w[j]=='\0' && (s[i+1]=='\0' || s[i+1]==' ')){
                if(first==-1) first = i+1-j;
                count++;
            }
        }else j=0;
    }

    // output
    if(count==0) printf("-1\n");
    else printf("%d %d\n", count, first);
    return 0;
}

PS: 到底要写多详细才能给过呢= =