Я пытался решить вопрос Префикс суффикса о Codeforces, когда столкнулся с неопределенной ошибкой чтения. Вот мое представление
#include <bits/stdc++.h>
#define ll long long int
#define MOD 998244353
using namespace std;
int KMP (string s) {
int arr[s.length()];
int i = 1, j = 0;
arr[0] = 0;
while( i < s.length()) {
if(s[i] == s[j]) {
arr[i] = j + 1;
i++;
j++;
}
else {
if( j != 0) {
j = arr[j -1];
}
else arr[i] = 0;
i++;
}
}
return arr[s.length() - 1];
}
void solve() {
string s;
cin >> s;
int i = 0, j = s.length() - 1;
while ( i <= j && s[i] == s[j] ) {
if( i == j || i + 1 == j ) {
cout << s << endl;
return;
}
i++; j--;
}
int k = i;
string newS = s.substr(i, s.size() - 2 * i);
string rev = newS;
reverse(rev.begin(), rev.end());
string pal1 = newS + '#' + rev;
string pal2 = rev + '#' + newS;
// cout << newS << " " << rev << " " << pal1 << " " << pal2 << endl;
string res = "";
int size1 = KMP(pal1),size2 = KMP(pal2);
if( size1 > size2) {
res += s.substr(0, k + size1) + s.substr(s.size() - i);
}
else {
res += s.substr(0, k) + s.substr(s.size() - i - size2);
}
cout << res << endl;
}
int main()
{
int t;
cin >> t;
while(t--) {
solve();
}
}
, которое дало следующую проблему
Diagnostics detected issues [cpp.g++17-drmemory]: ~~Dr.M~~ Dr. Memory version 1.11.0
~~Dr.M~~ Running "program.exe"
~~Dr.M~~
~~Dr.M~~ Error #1: UNINITIALIZED READ: reading 0x1059fe8c-0x1059fe90 4 byte(s)
~~Dr.M~~ # 0 solve [K:\invoker-prod\work\codeforces6\2d955443cb64b59d0725278c4118bdb0\compile-dc6a4b92d96ace20e3fc7f428e5ccac3/p71.cpp:52]
~~Dr.M~~ # 1 main [K:\invoker-prod\work\codeforces6\2d955443cb64b59d0725278c4118bdb0\compile-dc6a4b92d96ace20e3fc7f428e5ccac3/p71.cpp:66]
~~Dr.M~~ Note: @0:00:00.620 in thread 4944
~~Dr.M~~ Note: instruction: cmp %eax 0xffffffe4(%ebp)
~~Dr.M~~
~~Dr.M~~ TERMINATING PROCESS after first error found
~~Dr.M~~
~~Dr.M~~ ERRORS FOUND:
~~Dr.M~~ 0 unique, 0 total unaddressable access(es)
~~Dr.M~~ 1 unique, 1 total uninitialized access(es)
~~Dr.M~~ 0 unique, 0 total invalid heap argument(s)
~~Dr.M~~ 0 unique, 0 total GDI usage error(s)
~~Dr.M~~ 0 unique, 0 total handle leak(s)
~~Dr.M~~ 0 unique, 0 total warning(s)
~~Dr.M~~ 0 unique, 0 total, 0 byte(s) of leak(s)
~~Dr.M~~ 0 unique, 0 total, 0 byte(s) of possible leak(s)
~~Dr.M~~ ERRORS IGNORED:
~~Dr.M~~ 2 potential error(s) (suspected false positives)
~~Dr.M~~ (details: K:\invoker-prod\work\codeforces6\e66acc517678db6ede3f663ff018663a\check-7d66d73ddd03e8e7418a8d6e48a639ee\run\DrMemory-program.exe.2504.000\potential_errors.txt)
~~Dr.M~~ 11 unique, 11 total, 24568 byte(s) of still-reachable allocation(s)
~~Dr.M~~ (re-run with "-show_reachable" for details)
~~Dr.M~~ Details: K:\invoker-prod\work\codeforces6\e66acc517678db6ede3f663ff018663a\check-7d66d73ddd03e8e7418a8d6e48a639ee\run\DrMemory-program.exe.2504.000\results.txt
~~Dr.M~~ WARNING: application exited with abnormal code 0xc0000005
Строка 52 - это та, где я сравниваю два размера после вызова функции KMP.
if( size1 > size2) {
После прочтения я узнал, что эта ошибка возникает, когда переменной выделяется память, но ей не присваивается значение, и она используется в операции. Я попытался назначить целое число переменным, которое, как я думал, послужило причиной этой проблемы, но также не помогло. Вот еще два представления к тому же 76739874 76740717