测试了好几个洛谷样例,本地结果是正确的,但是提交就RE,为什么?
查看原帖
测试了好几个洛谷样例,本地结果是正确的,但是提交就RE,为什么?
435775
DuWei123123楼主2021/6/13 15:56

我测试了洛谷的8个样例,结果和答案一模一样,但是一直报RE.我去百度了RE原因,说数组越界等等,但我的代码不是这个原因.

我的思路是,先读取数据,然后读取过程中大写字母全部变成小写字母.我将它弄成一个函数

void read(char* p)
{
    int ret = 0, i = 0;
    while ((ret = getchar()) != '\n')
    {
        if ((ret >= 'A') && (ret <= 'Z'))
        {
            p[i++] = ret - 32;
        }
        else
        {
            p[i++] = ret;
        }
    }
    p[i] = '\0'; //末尾补0
}

然后再写另一个函数,作用是进行比较.

这里用到两个函数,一个是strtok,截取片断. 一个是strcmp,比较是否一样?

我用指针first接收第一次出现的位置,最后利用指针减指针的思路获取下标.

void compa(char* dst, char* cmp) {

char* tmp = NULL;

int sum = 0;//单词出现次数.

char* first = NULL;//第一次出现地址

for (tmp = strtok(cmp," "); tmp != NULL; tmp = strtok(NULL, " "))
{

    if (!sum && !strcmp(dst, tmp)) first = tmp;// 之所以加上!sum是为了只让first接收一次

    if (!strcmp(dst, tmp)) sum++;
    //sum记录数字单词出现的次数
}

if (first != NULL)
{
    printf("%d %d",sum,first - cmp);
    //打印数据
}
else
{
    printf("%d\n", -1);
}

} 总的代码

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char dst[102] = { 0 };
char cmp[1000002] = { 0 };

void read(char* p)
{
    int ret = 0, i = 0;
    while ((ret = getchar()) != '\n')
    {
        if ((ret >= 'A') && (ret <= 'Z'))
        {
            p[i++] = ret + 32;
        }
        else
        {
            p[i++] = ret;
        }
    }
    p[i] = '\0';
}

void compa(char* dst, char* cmp)
{

    char* tmp = NULL;

    int sum = 0;//单词出现次数.

    char* first = NULL;//第一次出现地址

    for (tmp = strtok(cmp," "); tmp != NULL; tmp = strtok(NULL, " "))
    {

        if (!sum && !strcmp(dst, tmp)) first = tmp;

        if (!strcmp(dst, tmp)) sum++;
    }

    if (first != NULL)
    {
        printf("%d %d",sum,first - cmp);
    }
    else
    {
        printf("%d\n", -1);
    }
}

int main()
{
    read(dst);
    read(cmp);

    compa(dst, cmp);
    return 0;
}
                                     ```
2021/6/13 15:56
加载中...