Pagini recente » Cod sursa (job #2510497) | Cod sursa (job #920657) | Cod sursa (job #360349) | Cod sursa (job #1837422) | Cod sursa (job #689309)
Cod sursa(job #689309)
#include <fstream>
#include <algorithm>
using namespace std;
const int SIZE = 16388;
const int LOG = 15;
struct rem
{
int A, B, P;
} L[SIZE];
int N, K, logN;
char A[SIZE];
int P[LOG + 1][SIZE];
int maxp;
bool compare(const rem& r1, const rem& r2)
{
if (r1.A == r2.A)
return r1.B < r2.B;
return r1.A < r2.A;
}
int prefix(int p1, int p2)
{
if (p1 == p2)
return N - p1 + 1;
int result = 0;
for (int k = logN; k >= 0 && p1 <= N && p2 <= N; --k)
if (P[k][p1] == P[k][p2])
{
p1 += (1 << k);
p2 += (1 << k);
result += (1 << k);
}
return result;
}
int main()
{
ifstream fin("substr.in");
ofstream fout("substr.out");
fin >> N >> K >> A;
for (int i = 1; i <= N; ++i)
P[0][i] = A[i - 1];
int logn;
for (logn = 1; (1 << (logn - 1)) <= N; ++logn)
{
for (int i = 1; i <= N; ++i)
{
L[i].P = i;
L[i].A = P[logn - 1][i];
L[i].B = (i + (1 << (logn - 1)) <= N ? P[logn - 1][i + (1 << (logn - 1))] : -1);
}
sort(L + 1, L + N + 1, compare);
int now = 0;
for (int i = 1; i <= N; ++i)
if (L[i].A == L[i - 1].A && L[i].B == L[i - 1].B)
P[logn][L[i].P] = now;
else
P[logn][L[i].P] = ++now;
}
logN = logn - 1;
for (int i = 1; i <= N - K + 1; ++i)
{
int pre = prefix(L[i].P, L[i + K - 1].P);
maxp = max(maxp, pre);
}
fout << maxp << '\n';
fin.close();
fout.close();
}