Cod sursa(job #2908961)

Utilizator CReaper1116Shang Cheng Lin CReaper1116 Data 7 iunie 2022 15:29:09
Problema Substr Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int mod = 100007;
const int mod2 = 100021;
char v[16384];
vector <int> v2[mod2];
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,p = 1,i,ans = 0;
    for(i = 0;i < nr - 1;i++){
        cod = (cod*256 + v[i])%mod;
        cod2 = (cod2*256 + v[i])%mod2;
        p*=256;
    }
    for(i = nr - 1;i < n;i++){
        cod = (cod*256 + v[i])%mod;
        cod2 = (cod2*256 + v[i])%mod2;
        add(cod,cod2);
        //cout<<cod<<' '<<cod2<<'\n';
        ans = max(ans,srch(cod,cod2));
        cod = (cod - p*v[i - nr + 1])%mod;
        if(cod < 0)cod+=mod;
        cod2 = (cod2 - p*v[i - nr + 1])%mod2;
        if(cod2 < 0)cod2+=mod2;
    }
    for(i = 0;i < mod2;i++)v2[i].clear();
    //cout<<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(l,mij - 1,n,k);
    }else return bs(mij,r,n,k);
}
int main()
{
    int n,k,i;
    fin>>n>>k;
    for(i = 0;i < n;i++){
        fin>>v[i];
    }
    fout<<bs(1,n,n,k);
    return 0;
}