ACM题解——洛谷P1308 统计单词数

////ACM题解——洛谷P1308 统计单词数

ACM题解——洛谷P1308 统计单词数

本文最早发布于本人的洛谷博客(目前已经咕咕咕了)。

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章

中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。

输入输出格式

输入格式:

共2行。

第1行为一个字符串,其中只含字母,表示给定单词;

第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式:

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数−1。

本来以为很简单,编着编着发现了一堆问题……(绝望)

因为要区分大小写,所以在读入后直接把所有的字母改为大写,之后在查找目标字符串最后加上空格,采用匹配首字母的方式进行查找,找到匹配的首字母后再次判断该字符之前是否为空格,若均为真则进入循环对之后的字符进行比对(由于第一个字母和最后一个字母并没有两边空格的形式,所以采用额外条件做特殊处理),在判断完全一致后增加计数并判断是否为第一次出现,若为真则将位置保存。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int main()
{
    char target[12];
    char es[1000001];
    int count = 0,result=0;
    long place = -1;
    scanf("%10s", target);
    getchar();
    gets(es);
    for (int i = 0; i <= 9; i++)
    {
        if (target[i] == 0)
        {
            target[i] = ' ';
            target[i + 1] = 0;
            count = i;
            break;
        }
        else if(target[i] > 90 )
        {
            target[i] = target[i] - 32;
        }
    }
    for (int i = 0; i <= 999999; i++)
    {
        if (es[i] > 90)
            es[i] = es[i] - 32;
        else if (es[i] == 0)
            break;
    }
    for (int i = 0; i <= 999999; i++)
    {
        if ((target[0] == es[i]))
        {
            if (i != 0)
            {
                if (es[i-1] != ' ')
                {
                    continue;
                }
            }
            for (int i1 = 1; i1 <= count; i1++)
            {
                if ((es[i + i1] == 0) && (i1 == count))
                {
                    result++;
                    if (place == -1)
                        place = i;
                    break;
                }
                if (es[i + i1] != target[i1])
                {
                    i = i + i1 - 1;
                    break;
                }
                if (i1 == count)
                {
                    result++;
                    if (place == -1)
                        place = i;
                    i += count;
                }
            }
        }
        else if (es[i] == 0)
        {
            break;
        }
    }
    if (result == 0)
    {
        puts("-1");
    }
    else
    {
        printf("%d %ld\n", result, place);
    }
    system("pause");
    return 0;
}
发布者 | 2019-07-02T02:40:26+08:00 12月 1st, 2018|ACM, 学习笔记, 题解|0条评论

关于作者

blank
坚强大概——并不是指的的结果,而是迈向某个目标的过程吧。

发表评论

召唤伊斯特瓦尔