Mai intai trebuie sa te autentifici.
Cod sursa(job #2021566)
Utilizator | Data | 13 septembrie 2017 22:33:11 | |
---|---|---|---|
Problema | Substr | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.45 kb |
#include <fstream>
#include <map>
using namespace std;
ifstream cin("subsr.in");
ofstream cout("subsr.out");
const unsigned long long base = 197;
unsigned long long hsh[16500];
unsigned long long put[16500];
char sir[16500];
map <unsigned long long , int> M;
int main() {
/*freopen ("input" , "r" , stdin);
freopen ("output" , "w" , stdout);
ios::sync_with_stdio(false);
cin.tie(NULL);*/
put[0] = 1;
for (int i=1; i<=16500; i++){
put[i] = put[i-1];
put[i] *= base;
}
int n , k;
cin>>n>>k;
for (int i=1; i<=n; i++){
cin>>sir[i];
}
for (int i=n; i>=1; i--){
hsh[i] = hsh[i + 1];
hsh[i] *= base;
hsh[i] += 1ULL * sir[i];
}
int st = 0;
int dr = n;
int ans = 0;
while(st <= dr){
//cout<<st<<" "<<dr<<'\n';
bool gasit = false;
int mij = (st + dr) / 2;
for (int i=1; i<=n-mij+1; i++){
unsigned long long h = hsh[i] - (hsh[i + mij] * put[mij]);
M[h] ++;
}
for (auto x : M){
//cout<<x.first<<" "<<x.second<<'\n';
if (x.second >= k){
gasit = true;
ans = mij;
break;
}
}
M.clear();
if (gasit == true){
st = mij + 1;
}
else{
if (st == dr){
break;
}
dr = mij;
}
}
cout<<ans;
return 0;
}