Pagini recente » Cod sursa (job #1857949) | Cod sursa (job #1352037) | Cod sursa (job #1472032) | Cod sursa (job #6919) | Cod sursa (job #757791)
Cod sursa(job #757791)
#include <fstream>
#include <iostream>
#include <cassert>
#include <algorithm>
using namespace std;
const int NMAX = 16384;
const int LOGMAX = 15;
int N, K, logN, x[NMAX], p[LOGMAX][NMAX], sortedPref[NMAX];
pair< pair<int, int>, int > v[NMAX];
string s;
int norm(char c)
{
if (c >= 'a' && c <= 'z')
return c -'a';
if (c >= 'A' && c <= 'Z')
return c-'A' + 26;
if (c >= '0' && c <= '9')
return c - '0' + 52;
assert(false);
return -1;
}
int lcs(int x, int y)
{
int ret = 0;
for (int k = logN; k >= 0; --k)
if (p[k][x] == p[k][y])
{
ret += 1<<k;
x += 1<<k;
y += 1<<k;
}
return ret;
}
int main()
{
ifstream fin("substr.in");
fin>>N>>K;
fin>>s;
for (int i = 0; i < N; ++i)
x[i] = norm(s[i]);
//Build suffix array
for (int i = 0; i < N; ++i)
p[0][i] = x[i];
logN = 0;
while ((1<<logN) < N) ++logN;
for (int k = 1; k <= logN; ++k)
{
for (int i = 0; i < N; ++i)
v[i] = make_pair(make_pair(p[k-1][i], i+(1<<(k-1)) < N ? p[k-1][i+(1<<(k-1))] : -1), i);
sort(v, v+N);
int index = 0;
p[k][v[0].second] = index;
for (int i = 1; i < N; ++i)
{
if (v[i].first > v[i-1].first) ++index;
p[k][v[i].second] = index;
}
}
for (int i = 0; i < N; ++i)
sortedPref[p[logN][i]] = i;
int ans = 0;
for (int i = 0; i + K - 1 < N; ++i)
ans = max(ans, lcs(sortedPref[i], sortedPref[i+K-1]));
ofstream fout("substr.out");
fout<<ans<<"\n";
return 0;
}