Pagini recente » Cod sursa (job #2640886) | Cod sursa (job #383059) | Cod sursa (job #2311490) | Cod sursa (job #3003627) | Cod sursa (job #2346573)
#include <bits/stdc++.h>
#define DIM_node 105
#define DIM_edges 1
#define DIM 16390
#define INF 2*DIM
#define v1 first.first
#define v2 first.second
#define position second
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
pair< pair<int, int>, int > L[DIM];
int n, k, Exponent;
int A[17][DIM], arr[DIM];
int lcp( int a, int b )
{
int exponent = Exponent;
int power = (1<<exponent);
int solution = 0;
while( power )
{
if( A[exponent][a] == A[exponent][b] )
solution += power, a += power, b += power;
power /= 2;
exponent--;
}
return solution;
}
int main()
{
in>>n>>k;
if( k == 1 )
{
out<<n;
return 0;
}
for( int i = 0; i < n; i++ )
{
char ch;
in>>ch;
A[0][i] = ch - '0';
}
for( int exponent = 0; (1<<exponent) <= n; exponent++ )
{
int power = (1<<exponent);
Exponent = exponent;
for( int i = 0; i < n; i++ )
{
L[i].v1 = A[exponent][i];
L[i].v2 = ( i + power < n ) ? A[exponent][i + power] : -1;
L[i].position = i;
}
sort( L, L + n );
A[exponent + 1][ L[0].position ] = 0;
for( int i = 1; i < n; i++ )
if( L[i].first == L[i - 1].first )
A[exponent + 1][ L[i].position ] = A[exponent + 1][ L[i - 1].position ];
else
A[exponent + 1][ L[i].position ] = A[exponent + 1][ L[i - 1].position ] + 1;
}
for( int i = 0; i < n; i++ )
arr[ A[Exponent][i] ] = i;
int solution = 0;
for( int i = 0; i + k - 1 < k; i++ )
solution = max( solution, lcp( arr[i], arr[i + k -1] ) );
out<<solution;
return 0;
}