Pagini recente » Cod sursa (job #791278) | Cod sursa (job #5617) | Cod sursa (job #1898078) | Cod sursa (job #46721) | Cod sursa (job #2908821)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int mod = 666013;
const int mod2 = 666015;
vector <int> v[mod];
void add(int x){
v[x%mod].push_back(x%mod2);
}
int srch(int x){
int cnt = 0;
for(auto i:v[x%mod]){
if(x%mod2 == i)cnt++;
}
return cnt;
}
char ch[16384];
int chck(int k,int n){
int nr = 0,p = 1,i,ans = 0;
for(i = 0;i < k;i++){
nr = (1ll*nr*256 + ch[i])%mod;
p = 1ll*p*256%mod;
}
for(i = k;i < n;i++){
add(nr);
ans = srch(nr);
nr = (1ll*nr*256 + ch[i])%mod;
nr = (nr - 1ll*p*ch[i - k])%mod;
if(nr < 0)nr+=mod;
}
add(nr);
ans = srch(nr);
//cout<<k<<' '<<n<<' '<<ans<<'\n';
return ans;
}
int bs(int l,int r,int nr,int n){
//fout<<l<<' '<<r<<' ';
if(l == r)return l;
int mij = (l + r + 1)/2;
//fout<<mij<<'\n';
if(chck(mij,n) >= nr){
return bs(mij,r,nr,n);
}else return bs(l,mij - 1,nr,n);
}
int main()
{
int n,k,i;
fin>>n>>k;
for(i = 0;i < n;i++){
fin>>ch[i];
}
fout<<bs(0,n - 1,k,n);
return 0;
}