我测试了洛谷的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;
}
```