Я писал простую программу на С++.
#include <bits/stdc++.h>
#define ll long long
#define ul unsigned long long
#define ld long double
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define repi(i, a, b) for (int i = (a); i > (b); i--)
#define all(x) x.begin(), x.end()
#define ks(x) (cout << #x << ":" << (x) << '\n')
#define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr)
#define gcd _gcd
using namespace std;
const ll mod = 1000000007;
int main()
{
fastio;
ll tc = 1;
cin >> tc;
for (ll t = 0; t < tc; t++)
{
ll n;
cin >> n;
string s;
cin >> s;
ll cnt = 0;
ll i = n - 1;
if (s[n - 1] == ')')
{
i--;
cnt++;
while (s[i] == ')' && i > -1)
{
i--;
cnt++;
}
}
if (cnt > n / 2)
cout << "YES\n";
else
{
cout << "NO\n";
}
}
return 0;
}
и введите его с помощью *
5
2
))
12
gl))hf))))))
9
gege)))))
14
)aa))b))))))))
1
)*
но он показывает вывод, я не могу понять, пожалуйста, помогите
/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdС++-v3/include/bits/basic_string.h:1067: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::ссылка std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [с _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = символ&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]: утверждение '__pos <= size()' не удалось.
но он работает на ноутбуке моего друга с тем же кодом и тем же вводом
Да, это определение неопределенного поведения в вашем коде. Запустите свой любимый отладчик и посмотрите, что и почему вызывает это.
да, я получил свою ошибку, но я все еще не могу найти, как она работала на компьютере моего друга? и это также принято на codeforces? как это работало, объясните, пожалуйста, это из-за другой версии компилятора, например, у меня MinGW 32, а у него Mingw64?
Я не уверен, что непонятно. Поведение не определено, оно может делать что угодно, включая работу. В частности, похоже, что ваш компилятор имеет дополнительные проверки. Другие компиляторы могут просто принять s[-1]
с мыслью, что «если что-то выйдет из строя, это не наша вина».
Утверждение __pos <= size()
означает, что вы обращаетесь к строке s с помощью оператора [] после конца. Запустите программу в отладчике и либо установите условную точку останова на index > size(), либо просто проверяйте каждый доступ.
s[i] == ')' && i > -1
с i = -1 сначала попытаетесь получить доступ s[-1]
, прежде чем проверять i > -1
как оператор && как ассоциативность слева направо.Это не верно
while (s[i] == ')' && i > -1)
должен быть
while (i > -1 && s[i] == ')')
Если i равно -1, то в первой версии s[i]
выдает ошибку, которую вы видите. Но во второй версии i > -1
оценивается первым и, поскольку оно ложно, s[i]
не оценивается и поэтому не вызывает ошибки.
Здесь тоже есть важный урок. Эта программа работала на машине ваших друзей, но не каждая программа с ошибкой дает сбой. Может даже показаться, что он работает правильно.
да, я понял свою ошибку, но я все еще не могу понять, как это работает на компьютере моего друга? и это также принято на codeforces? как это работало, объясните, пожалуйста, это из-за другой версии компилятора, например, у меня MinGW 32, а у него Mingw64?
@Suryakant Как я уже сказал, не каждая программа на C++ с ошибкой завершается с ошибкой. С++ так не работает. Причина, вероятно, в различиях ваших компиляторов, но теоретически это может быть что угодно. Когда вы пишете программу с такой ошибкой, C++ не дает вам никаких гарантий, как она будет работать.
У вас есть ошибка индексации вне диапазона, вы пытались отладить свою программу?