Stringhe di Fibonacci (fibstr)

Salve, stavo provando a risolvere Stringhe di Fibonacci, la mia soluzione genera tutte le stringhe di fibonacci fino alla dimensione Nesima e poi tramite la ricerca binaria sceglie quella migliore verificando se il “pattern” è lo stesso di quella generata. Avete consigli su come migliorare l’implementazione?

#include <bits/stdc++.h>
using namespace std;

int main() 
{    
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int N;
    cin >> N;

    string S;
    cin >> S;

    int sumFib[N + 1];
    sumFib[0] = 1;  
    sumFib[1] = 1;
    for (int i = 2; i <= N; i++)
        sumFib[i] = sumFib[i - 1] + sumFib[i - 2];

    string fib[N + 1];
    fib[0] = "b";
    fib[1] = "a";
    for (int i = 2; i <= N; i++) 
        fib[i] = fib[i - 1] + fib[i - 2];

    int l = 0, r = 1;
    for (; sumFib[r] <= N; r++);
    
    while (l < r - 1) 
    {
        int m = (l + r) / 2;

        int flag = false;
        for (int i = 0; i <= N - sumFib[m]; i++)
        {
            map<char, bool> cnt;
            cnt['a'] = 1;
            cnt['b'] = 0;
            cnt[S[i]] = 0;

            int x;
            bool diff = false;
            for (x = i; x <= i + sumFib[m] - 1; x++) 
            {
                if (cnt[S[x]] != cnt[fib[m][x-i]])
                {
                    if (!diff)
                        {cnt[S[x]] = 1; diff = true;}
                    else break;
                }
            }

            if (x == i + sumFib[m])
            {
                flag = true;
                break;
            }
        }

        if (flag) 
            r = m;
        else 
            l = m;
    }

    cout << l;
}