Cod sursa(job #2200394)

Utilizator MaligMamaliga cu smantana Malig Data 1 mai 2018 11:13:43
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
  
using namespace std;
  
#if 1
    #define pv(x) cout<<#x<<" = "<<(x)<<"; ";cout.flush()
    #define pn cout<<endl
#else
    #define pv(x)
    #define pn
#endif
  
#ifdef INFOARENA
    ifstream in("substr.in");
    ofstream out("substr.out");
#else 
    #define in cin
    #define out cout
#endif
  
using ll = long long;
using ull = unsigned long long;
using ui = unsigned int;
#define pb push_back
#define mp make_pair
const int NMax = 2e4 + 5;
const ll inf_ll = 1e18 + 5;
const int inf_int = 1e9 + 5;
using zint = int;
  
int dp[20][NMax];

struct elem {
    int o1,o2,idx;
    bool operator<(const elem& other) {
        return o1 == other.o1 ? o2 < other.o2 : o1 < other.o1;
    }
};

int lcp(int x, int y, int step, int N) {
    if (x == y) {return N - x;}
    int ans = 0;
    for (int k = step;k >= 0 && x < N && y < N; --k) {
        if (dp[k][x] == dp[k][y]) {
            ans += 1 << k;
            x += 1 << k;
            y += 1 << k;
        }
    }

    return ans;
}

int main() {
    cin.sync_with_stdio(false);
    cin.tie(0);
  
    int N,K;
    string str;
    in >> N >> K >> str;

    for (int i = 0; i < N;++i) {
        dp[0][i] = str[i] - 'a';
    }
    vector<elem> v(N);
    
    int step = 1, pw = 1;
    for (; pw <= N; ++step, pw <<= 1) {
        for (int i = 0; i < N;++i) {
            v[i].o1 = dp[step-1][i];
            v[i].o2 = i + pw < N ? dp[step-1][i + pw] : -1;
            v[i].idx = i;
        }

        sort(v.begin(), v.end());

        dp[step][v[0].idx] = 0;
        for (int i = 1; i < N; ++i) {
            dp[step][v[i].idx] = dp[step][v[i-1].idx];
            dp[step][v[i].idx] += !(v[i-1].o1 == v[i].o1 && v[i-1].o2 == v[i].o2);
        } 
    }
    --step;

    int ans = 0;
    for (int i = 0; i <= N - K; ++i) {
        int val = lcp(v[i].idx, v[i + K - 1].idx, step, N);
        ans = max(val, ans);
    }

    out << ans;
  
    return 0;
}