Cod sursa(job #2908966)

Utilizator CReaper1116Shang Cheng Lin CReaper1116 Data 7 iunie 2022 16:00:38
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
typedef long long ll;
const int mod = 1e15 + 1;
ll p[16384];
ll v3[16384];
char v[16384];
int chck(int nr,int n){
    ll cod = 0;
    int i,ans = 0,cnt = 0,cnt2 = 1;
    //for(i = 0;i < n;i++)fout<<v[i]<<' ';
    for(i = 0;i < nr - 1;i++){
        cod = (256*cod + v[i])%mod;
    }
    for(i = nr - 1;i < n;i++){
        cod = (256*cod + v[i])%mod;
        v3[cnt++] = cod;
        cod = (cod - p[nr - 1]*v[i - nr + 1])%mod;
        if(cod < 0)cod+=mod;
    }
    sort(v3,v3 + cnt);
    for(i = 1;i < cnt;i++){
        if(v3[i] == v3[i - 1]){
            cnt2++;
        }else{
            ans = max(ans,cnt2);
            cnt2 = 1;
        }
    }
    ans = max(ans,cnt2);
    //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] = 1;
    for(i = 1;i < n;i++){
        p[i] = p[i - 1]*256%mod;
    }
    fout<<bs(1,n,n,k);
    return 0;
}