Cod sursa(job #2238528)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 6 septembrie 2018 11:52:14
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("substr.in");
ofstream fout ("substr.out");

const int mod1 = 1013, mod2 = 673,base1 = 79,Dim = 17385,base2 = 29;
int Hash[mod1][mod2],n,k,Powbase1[Dim],Powbase2[Dim];
char T[Dim];
bool Check(int lung);
int main() {
	
	fin >> n >> k >> ( T + 1 );
	Powbase1[0] = 1;
	for ( int i = 1; i <= n; ++i)
		Powbase1[i] = (Powbase1[i-1] * base1) % mod1;
	Powbase2[0] = 1;
	for ( int i = 1; i <= n; ++i)
		Powbase2[i] = (Powbase2[i-1] * base2) % mod2;
	
	int st = 1, dr = n / k + 1,mj,sol = 0;
	while ( st <= dr) {
		mj = ( st + dr ) / 2;
		if ( /*Check(mj)*/  1) 
			st = mj + 1, sol = mj;
		else
			dr = mj - 1;
	}
	fout << sol;
}

bool Check(int lung) {
	
	memset(Hash,0,sizeof(Hash));
	int cHash = 0,CHash = 0;
        for ( int j = 1; j <= n; ++j) {
            cHash = (cHash * base1+ (T[j] -'a' + 1)) % mod1;
            CHash = (CHash * base2+ (T[j] -'a' + 1)) % mod2;
                if ( j > lung) {
                cHash = (cHash - ((T[j-lung] - 'a' + 1)* Powbase1[lung]) % mod1 + mod1) % mod1;
                CHash = (CHash - ((T[j-lung] - 'a' + 1)* Powbase2[lung]) % mod2 + mod2) % mod2;
                                }
            if ( j >= lung)
				Hash[cHash][CHash]++;
            
        }
	for ( int i = 0; i < mod1; ++i)
		for ( int j = 0; j < mod2; ++j)
			if ( Hash[i][j] >= k)
				return true;
	return false;
 }