请查看以下代码
#include<iostream>
#include <string.h>
using namespace std;
int main()
{
char ami[100000], tumi[100000];
scanf("%s ", ami);
scanf("%s ", tumi);
//************ This is the Problem***********
cout << "OK" << endl;
//*******************************************
int l1 = strlen(ami);
int l2 = strlen(tumi);
int fwd[l1+1];
int rev[l1+1];
int j = 0;
for(int i = 0; i < l1;i++)
{
if(j < l2 && ami[i] == tumi[j])
{
j++;
fwd[i]++;
}
if(i!=0)
fwd[i] += fwd[i-1];
}
j = l2- 1;
for(int i = l1-1; i>=0; i--)
{
if(j >= 0 && ami[i] == tumi[j] )
{
j--;
rev[i]++;
}
if(i!= l1-1)
rev[i]+=rev[i+1];
}
long long int Q, HUDAI;
scanf("%lld %lld", &Q, &HUDAI);
for(int i = 0; i < Q; i++)
{
long long int x, y;
scanf("%lld %lld", &x, &y);
if(fwd[x-1]+rev[y+1] >= l2) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
我运行此程序以跟踪输入
abcabcxy
ax
2 2
2 6
6 7
在此代码中,如果我多次(5-7次)运行相同的代码,则会显示不同的输出。 有时“ OK YES NO”。有时“ OK YES YES”。 但是如果我评论“ cout <<“ OK” << endl;“这行总是显示“ YES YES” 谁能说我为什么会这样? 如何摆脱呢?
答案 0 :(得分:2)
有一些超出范围错误的情况。我删除了C字符串,C数组和非标准功能,并添加了一些绑定检查并移动了一个绑定检查。现在您的代码输出了NO NO
,但我没有发现任何未定义的行为:
#include <array>
#include <iostream>
#include <vector>
int main() {
std::string ami, tumi;
std::cin >> ami >> tumi;
//************ This is the Problem***********
std::cout << "OK\n";
//*******************************************
const int l1 = ami.length();
const int l2 = tumi.length();
std::vector<int> fwd(l1 + 1);
std::vector<int> rev(l1 + 1);
for (int i = 0, j = 0; i < l1; ++i) {
if (static_cast<std::size_t>(j) < tumi.length() &&
ami.at(i) == tumi.at(j) && j < l2) {
++j;
++fwd[i];
}
if (i != 0) fwd.at(i) += fwd.at(i - 1);
}
for (int i = l1 - 1, j = l2 - 1; i >= 0; --i) {
if (j >= 0 && ami.at(i) == tumi.at(j)) {
--j;
++rev.at(i);
}
if (i != l1 - 1) rev.at(i) += rev.at(i + 1);
}
long long int Q, HUDAI;
std::cin >> Q >> HUDAI;
for (int i = 0; i < Q; ++i) {
long long int x, y;
std::cin >> x >> y;
if (fwd.at(x - 1) + rev.at(y + 1) >= l2)
std::cout << "YES\n";
else
std::cout << "NO\n";
}
return 0;
}