二分答案 (遍历 map 做 check 函数)

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


bool check(int mid, string s)
{
    map <string, int> ma;
    
    for (int i = 0; i < s.size() - mid + 1; i ++ ){
         ma[s.substr(i, mid)] ++ ;
    }
    
    if (ma.size() == (int)pow(2, mid))
        return false;
    else
        return true;
}

signed main(void)
{
    string s; cin >> s;
    
    int l = 1, r = 1;
    while ((int)pow(2, r) <= s.size())
        r ++ ;

    // cout << r << endl;
    
    while (l < r){
        int mid = l + r >> 1;
        if (check(mid, s)) r = mid;
        else l = mid + 1;
    }
    
    cout << l << endl;
    return 0;
}