Pagini recente » Cod sursa (job #1133642) | Cod sursa (job #2738262) | Cod sursa (job #2906032) | Cod sursa (job #710180) | Cod sursa (job #2908964)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int mod = 100021;
const int mod2 = 666013;
char v[16384];
int p[16384],p2[16384];
int f[mod2];
int ltu[mod2],gv = 0;
vector <int> v2[mod];
void add(int a,int b){
v2[a].push_back(b);
}
int srch(int x,int y){
int cnt = 0;
for(auto i:v2[x]){
if(i == y){
cnt++;
}
}
return cnt;
}
int chck(int nr,int n){
int cod = 0,cod2 = 0,i,ans = 0;
for(i = 0;i < nr - 1;i++){
cod = (cod*256 + v[i])%mod;
cod2 = (cod2*256 + v[i])%mod2;
}
for(i = nr - 1;i < n;i++){
cod = (cod*256 + v[i])%mod;
cod2 = (cod2*256 + v[i])%mod2;
add(cod,cod2);
//fout<<cod<<' '<<cod2<<'\n';
//ans = max(ans,srch(cod,cod2));
//cout<<cod<<' '<<cod2<<'\n';
cod = (cod - p[nr - 1]*v[i - nr + 1])%mod;
if(cod < 0)cod+=mod;
cod2 = (cod2 - p2[nr - 1]*v[i - nr + 1])%mod2;
if(cod2 < 0)cod2+=mod2;
}
for(i = 0;i < mod;i++){
for(auto j:v2[i]){
if(gv != ltu[j]){
ltu[j] = gv;
f[j] = 0;
}
f[j]++;
ans = max(ans,f[j]);
}
gv++;
v2[i].clear();
}
//fout<<nr<<' '<<ans<<'\n';
return ans;
}
int bs(int l,int r,int n,int k){
if(l == r)return l;
int mij = (l + r + 1)/2;
if(chck(mij,n) >= k){
return bs(mij,r,n,k);
}else return bs(l,mij - 1,n,k);
}
int main()
{
int n,k,i;
fin>>n>>k;
for(i = 0;i < n;i++){
fin>>v[i];
}
p[0] = p2[0] = 1;
for(i = 1;i < n;i++){
p[i] = p[i - 1]*256%mod;
p2[i] = p2[i - 1]*256%mod2;
}
fout<<bs(1,n,n,k);
return 0;
}