'Why are the results different under debugging and running?

I'm solving a algorithm problem https://codeforces.com/contest/1671/problem/E. Although my submit can pass the tests provided by the contest, I find it fails on specific test(Hack). When I'm trying to find where's the error, I find that if I choose start debugging, the program would run perfectly. However, when I click "run", it would give a wrong answer. So, I'm curious about what happens.

#include<iostream>
#include <algorithm>
#include <cstring>

using namespace std;
int const NN = 1e6;
int const MOD = 998244353;
char str[NN];

long long dfs_data[NN];
int powans[20];
string myhash[NN];
int n;

long long dfs(int num) {
   if (dfs_data[num] != 0) return dfs_data[num];
   if (num >= powans[n - 1] - 1) {
       dfs_data[num] = 1;
       return 1;
   }
   if (myhash[num * 2 + 1] == myhash[num * 2 + 2]) {
       dfs_data[num] = (dfs(num * 2 + 1) % MOD) * (dfs(num * 2 + 2) % MOD) % MOD;
   } else dfs_data[num] = 2 * (dfs(num * 2 + 1) % MOD) * (dfs(num * 2 + 2) % MOD) % MOD;
   return dfs_data[num];
}

void gethashcode(int t) {

   if (t >= powans[n - 1] - 1) {
       myhash[t] += str[t];
       return;
   }
   if (myhash[2 * t + 1] == "") gethashcode(2 * t + 1);
   if (myhash[2 * t + 2] == "") gethashcode(2 * t + 2);
   if (myhash[2 * t + 1] < myhash[2 * t + 2]) myhash[t] = str[t] + myhash[2 * t + 1] + myhash[2 * t + 2];
   else myhash[t] = str[t] + myhash[2 * t + 2] + myhash[2 * t + 1];
}

void solve() {
   memset(dfs_data, 0, sizeof dfs_data);

   cin >> n;
   cin >> str;
   powans[0] = 1;
   for (int i = 1; i < 19; i++) {
       powans[i] = 2 * powans[i - 1];
   }

   for (int i = 0; i < NN; i++) {
       myhash[i] = "";
   }

   gethashcode(0);

   cout << dfs(0);
}

int main() {
   solve();
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source