Cod sursa(job #2433953)

Utilizator belugaBeluga beluga Data 29 iunie 2019 22:14:48
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <bits/stdc++.h>
using namespace std;

#define mp make_pair
#define sz(x) (int)((x).size())
#define all(x) (x).begin(),(x).end()
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define eb emplace_back

typedef pair< int, int > pii;
typedef pair< long long, long long > pll;
typedef long long ll;
typedef vector< int > vi;
typedef vector< ll > vll;
typedef vector< pii > vpii;
typedef vector< pll > vpll;
typedef long double ld;
typedef vector< ld > vld;

const ll MOD = 1e9 + 7;

void fix(ll &x, ll &MOD) {
    x = (x % MOD + MOD) % MOD;
    return;
}

ll lgput(ll a, ll b, ll MOD) {
    ll ret = 1;
    a %= MOD;
    while(b) {
        if(b&1) ret = ret*a % MOD;
        a = a*a % MOD;
        b >>= 1;
    }
    
    return ret;
}

struct str{
	int a, b, c;
	str(int _a = 0, int _b = 0, int _c = 0) : a(_a), b(_b), c(_c) {}

	const bool operator < (str &o) const {
		return a==o.a?b<o.b:a<o.a;
	}
};

const int MAXN = 16400;
const int MAXLOG = 16;

int p[MAXLOG][MAXN];
int sortate[MAXN];

vector< str > v;
int n, k;
string s;

int lcp(int x, int y) {
	int ret = 0;

	for(int step = MAXLOG-1; step >= 0; --step) {
		if(x+(1<<step) <= sz(s) && y+(1<<step) <= sz(s) && p[step][x] == p[step][y]) {
			x += (1<<step);
			y += (1<<step);
			ret += (1<<step);
		}
	}

	return ret;
}

int main() {   
    #ifdef BLAT
        freopen("stdin", "r", stdin);
        freopen("stderr", "w", stderr);
    #else 
        freopen("substr.in", "r", stdin);
        freopen("substr.out", "w", stdout);
    #endif

    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout.precision(12);
    srand(time(NULL));

    int n, k;
    cin >> n >> k;
    cin >> s;
    
    v.resize(sz(s));
    for(int i = 0; i < sz(s); ++i) {
    	p[0][i] = s[i];
    }

    for(int pas = 1, dim = 1; pas < MAXLOG; ++pas, dim <<= 1) {
    	for(int i = 0; i < sz(s); ++i) {
    		v[i].a = p[pas-1][i];
    		v[i].b = i+dim<sz(s)?p[pas-1][i+dim]:-1;
    		v[i].c = i;
    	}

    	sort(all(v));

    	for(int i = 0; i < sz(s); ++i) {
    		if(i && v[i].a == v[i-1].a && v[i].b == v[i-1].b) p[pas][v[i].c] = p[pas][v[i-1].c];
    		else p[pas][v[i].c] = i;

    		sortate[i] = v[i].c;
    	}
    }

    int ans = 0;

    for(int i = 0; i + k - 1 < sz(s); ++i) {
    	ans = max(ans, lcp(sortate[i], sortate[i+k-1]));
    }

    cout << ans << '\n';
}