在vjudge写算法题,想用cin从数组下标1开始输入
在电脑上运行没问题,但是提交上去后显示编译错误
#include
using namespace std;
const int N = 1001000, M = 1000010;
int n, m;
char p[N], s[M];
int ne[N];
int sum = 0;
int main() {
cin >> (p + 1) >> (s + 1);//这里+1报错,不+1不会报错
int t = strlen(p + 1);
int u = strlen(s + 1);
int i, j;
for (i = 2, j = 0; i <= t; i++) {
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j++;
ne[i] = j;
}
for (i = 1, j = 0; i <= u; i++) {
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j++;
if (j == t)
{
sum++;
j = ne[j];
}
}
printf("%d", sum);
return 0;
}
参考GPT和自己的思路:
对于该问题,编译错误可能是因为在部分编译器中,使用 cin
从数组下标 1 开始输入会被认为是非法语法。为了解决这个问题,可以使用其他的输入方式,例如:
for(int i=1; i<=n; i++){
scanf("%d", &arr[i]);
}
或者手动给数组下标 0 赋值一个非实际意义的值,使得下标从 1 开始:
int arr[N+1];
arr[0] = 0;
for(int i=1; i<=n; i++){
cin >> arr[i];
}
还可以使用 std::ios::sync_with_stdio(false)
来解除 cin
和 cout
的同步,提高输入输出速度。最后,应该在代码中避免使用过多的全局变量。
参考GPT和自己的思路:
这个问题出现的原因是,在一些 Online Judge 上,cin 等输入输出流也用到了缓冲区,如果你的代码中有使用到数组下标,你需要保证所有的下标都在数组的有效范围内。具体地说,在 C++ 中,对于数组 p,s 的下标 i,如果你想从下标 1 开始读取,需要将表达式 p+i 替换为 p+(i-1),s+i 替换为 s+(i-1)。因此,在代码中
cin >> (p + 1) >> (s + 1);
应该改为
cin >> (p) >> (s);
如果你想从下标 2 开始读取,需要将表达式 p+i 替换为 p+(i-2),s+i 替换为 s+(i-2)。
不知道你这个问题是否已经解决, 如果还没有解决的话: