Cod sursa(job #2908821)

Utilizator CReaper1116Shang Cheng Lin CReaper1116 Data 6 iunie 2022 00:43:33
Problema Substr Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#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;
}