Pagini recente » Cod sursa (job #316030) | Cod sursa (job #2945133) | Cod sursa (job #870922) | Cod sursa (job #2951031) | Cod sursa (job #1288325)
/*
* Code by Spiromanul
*/
#include <fstream>
#include <unordered_map>
const char IN [ ] = "substr.in" ;
const char OUT [ ] = "substr.out" ;
const int MAX = 17000 ;
const int P = 477 ;
using namespace std;
ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;
char sir [ MAX ] ;
int n ;
int k ;
unordered_map < unsigned long long , int > hashin ;
int check ( int lungime )
{
unsigned long long BOSSHASH = 0 , put = 1 ;
for ( int i = 0 ; i < lungime ; ++ i )
{
BOSSHASH = BOSSHASH * P + ( int ) sir [ i ] ;
}
for ( int i = 1 ; i < lungime ; ++ i )
{
put = put * P ;
}
hashin.clear ( ) ;
hashin [ BOSSHASH ] = 1 ;
for ( int i = lungime ; i < n ; ++ i )
{
BOSSHASH -= sir [ i - lungime ] * put ;
BOSSHASH = BOSSHASH * P + ( int ) sir [ i ] ;
hashin [ BOSSHASH ] ++ ;
}
int sol = 0 ;
for ( auto x : hashin )
sol = max ( sol , x.second ) ;
return ( sol >= k ) ;
}
int cautarea_smechera_binara_a_lui_Patrascu ( )
{
int step = 1 << 14 ;
int i = 0 ;
for ( ; step ; step >>= 1 )
if ( i + step <= n and check ( i + step ) )
i += step ;
return i ;
}
int main( )
{
fin >> n >> k ;
fin >> sir ;
fout << cautarea_smechera_binara_a_lui_Patrascu() ;
return 0;
}