Pagini recente » Cod sursa (job #2723957) | Cod sursa (job #2217340) | Cod sursa (job #244445) | Cod sursa (job #337476) | Cod sursa (job #2476943)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n, k, rmq[30000][1000], lg2[30000], ans;
string s[30000], c;
multiset <int> ms;
void lg()
{
for(int i = 0; 1<<i <= 30000; i++)
lg2[1<<i] = i;
for(int i = 1; i <= 30000; i++)
if(!lg2[i]) lg2[i] = lg2[i-1];
}
int main()
{
fin >> n >> k;
fin >> c;
for(int i = 0; i < n; i++)
s[i]=c.substr(i);
sort(s, s+n);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < s[i].size(); j++)
if(s[i][j]!=s[i+1][j]) break;
else
rmq[i][0]++;
}
for(int i = 1; (1<<i) < n; i++)
{
for(int j = 0; j < n; j++)
{
if(j+(1<<i)-1 >= n) break;
rmq[j][i] = min(rmq[j][i-1], rmq[j+(1<<(i-1))][i-1]);
}
}
k--;
for(int i = 0; i < n-k; i++)
{
int d = lg2[k];
ans = max(ans, min(rmq[i][d], rmq[i+k-(1<<d)][d]));
}
fout << ans;
//for(int i = 0; i < n; i++) fout << s[i] << "\n";
return 0;
}