Pagini recente » Cod sursa (job #1742895) | Cod sursa (job #1518604) | Cod sursa (job #2246135) | Cod sursa (job #740459) | Cod sursa (job #2548077)
#include <bits/stdc++.h>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[51002];
int a[51000],p[20][51000];
long long p2,n,i,j,k,ss;
bool comp(int x,int y)
{
if(p[i - 1][x] != p[i - 1][y])
return p[i - 1][x] < p[i - 1][y];
if(x + p2 > n)
return 1;
if(y + p2 > n)
return 0;
return p[i - 1][x + p2] < p[i - 1][y + p2];
}
int com(int x,int y)
{
int l = 0,z;
for(z = i; z >= 0 && x <= n && y <= n; --z)
if(p[z][x] == p[z][y])
{
l += 1 << z;
x += 1 << z;
y += 1 << z;
}
return l;
}
int main()
{
f >> n >> k;
f.get();
f.getline(s + 1,51000);
//g << (s + 1);
//g << '\n';
n = strlen(s + 1);
for(i = 1; i <= n; ++i)
{
a[i] = i;
p[0][i] = s[i] - '\0';
}
for(i = p2 = 1; p2 <= n; ++i)
{
sort(a + 1,a + n + 1,comp);
for(j = 1,ss = 0; j <= n; ++j)
{
if(a[j] + p2 <= n && a[j - 1] + p2 <= n && p[i - 1][a[j]] == p[i - 1][a[j - 1]] && p[i - 1][a[j] + p2] == p[i - 1][a[j - 1] + p2])
ss++;
p[i][a[j]] = j - ss;
}
p2 = (1 << i);
}
i--;
int rasp = 0;
int in = 1;
int sf = n;
while(in <= sf)
{
int mij = (in + sf) / 2;
int ap = 1;
for(int i = 2; i <= n; ++i)
{
if(com(a[i],a[i - 1]) >= mij)
ap++;
else
ap = 1;
if(ap >= k)
{
in = mij + 1;
rasp = mij;
break;
}
}
if(rasp != mij)
sf = mij - 1;
}
g << rasp;
return 0;
}