Pagini recente » Cod sursa (job #569648) | Cod sursa (job #2711486) | Cod sursa (job #1999677) | Cod sursa (job #233633) | Cod sursa (job #2467424)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int D[17][16400];
int main()
{
int n, k;
fin >> n >> k;
string s;
fin >> s;
for(int i = 1 ; i <= n ; i++)
{
D[0][i] = s[i-1]-'a'+1;
}
int linie = 0;
int off = 0;
vector<pair< pair<int,int> , int> > v(n+1,{{0,0},0});
for(int i = 1 ; i*2 <= n ; i*=2)
{
linie++;
off = i;
for(int j = 1 ; j <= n ; j++)
{
if(j+i > n)
v[j] = { {D[linie-1][j], -1}, j};
else
v[j] = { {D[linie-1][j], D[linie-1][j+i]}, j };
}
sort(v.begin(), v.end());
int curent;
int ok = 0;
for(int j = 1 ; j <= n ; j++)
{
curent = 1;
D[linie][ v[j].second ] = j;
while( j+1<= n && v[j].first == v[j+1].first )
{
curent++;
D[linie][v[j+1].second] = D[linie][v[j].second];
j++;
}
if(curent >= k)
{
ok = 1;
}
}
}
int baza= 0;
vector< int > ans(n+1, 0);
v[0] = {{-2,-2},0};
for(; linie>=0 ; linie-- )
{
for(int i = 1 ; i <= n ; i++)
{
if( i + (1<<linie) + baza - 1 <= n )
v[i] = { {ans[i], D[linie][i+baza]}, i };
else
v[i] = { {ans[i], -1}, i };
}
sort(v.begin(), v.end());
int ok = 0;
for(int i = 1 ; i <= n ; i++ )
{
int current = 1;
while(i+1<= n && v[i].first == v[i+1].first )
i++, current++;
if(current >= k && (v[i].first.first != 0 || v[i].first.second != -1) )
ok = 1;
}
if(ok)
{
baza += (1<<linie);
for(int i = 1 ; i <= n ; i++)
{
ans[ v[i].second ] = i;
while(v[i].first == v[i+1].first && i+1 <= n)
{
ans[v[i+1].second] = ans[v[i].second];
i++;
}
}
}
}
fout << baza;
}