Pagini recente » Cod sursa (job #838820) | Cod sursa (job #2392980) | Cod sursa (job #2269484) | Cod sursa (job #1164045) | Cod sursa (job #481276)
Cod sursa(job #481276)
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<vector>
#define maxn 16400
#define r 24499973
#define b 79
#define rh 666013
using namespace std;
struct elem {
int inf, ap;
elem(int a, int bb){
inf = a;
ap = bb;
}
};
vector<elem> h[rh+5];
ofstream g("substr.out");
char a[maxn];
int prec[maxn];
int rest[rh+5];
int n, k;
int trym(int l){
int val = 0, nr = 0, cod, i, j, poz, nrt = 0;
for (i = 0; i<l; i++){
val = (val*b+a[i]-48)%r;
}
poz = val%rh;
h[poz].push_back(elem(val, 1));
for (i = l; i < strlen(a)-1; i++){
val = val - (prec[l-1]*(a[i-l]-48))%r;
if (val < 0)
val = val+r;
val = (val*b+a[i]-48)%r;
poz = val%rh;
cod = 1;
for (j=0; j<h[poz].size(); j++)
if (h[poz][j].inf == val){
h[poz][j].ap++;
if (h[poz][j].ap > nr)
nr = h[poz][j].ap;
cod = 0;
break;
}
if (cod == 1){
h[poz].push_back(elem(val, 1));
nrt++;
rest[nrt] = poz;
}
}
for (i = 1; i <= nrt; i++)
vector<elem>().swap(h[rest[i]]);
if (nr >= k)
return 1;
return 0;
}
int bsearch(int p, int u){
int m, poz=0;
while (p <= u){
m = (p+u)/2;
if (trym(m) == 1){
poz = m;
p = m+1;
}
else
u = m-1;
}
return poz;
}
int main(){
freopen("substr.in", "r", stdin);
int i, j, val, poz, cod, l;
scanf("%d %d ", &n, &k);
fgets(a, maxn, stdin);
prec[0] = 1;
for (i = 1; i <= n/k; i++)
prec[i]=(prec[i-1]*b)%r;
int rez = bsearch(0, n/k);
g<<rez<<endl;
return 0;
}