Cod sursa(job #3177521)

Utilizator paull122Paul Ion paull122 Data 29 noiembrie 2023 12:25:03
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ifstream fin("substr.in");
ofstream fout("substr.out");
#define HASH_BASE 73
#define HASH_SIZE1 2007
#define HASH_SIZE2 2021

int pwr(int a,int b,int mod)
{
    if(b==0)return 1;
    int p = pwr(a,b/2,mod) % mod;
    if(b%2)
    {
        return p*p*a% mod;
    }
    return p*p % mod;
}

int f[2007][2021];
char a[17000];
int n,k;

int addhash(int strhash,char x,int hbase,int hsize)
{
    strhash = (strhash * hbase + x)%hsize;
    return strhash;
}
int removehash(int strhash,char x,int put,int hsize)
{
    strhash = (strhash - x * put % hsize + hsize) % hsize;
    return strhash;
}
bool check(int len)
{
    memset(f,0,sizeof(f));
    int strhash1=0,strhash2=0;
    for(int i=1;i<=len;i++)
    {
        strhash1 = addhash(strhash1,a[i],HASH_BASE,HASH_SIZE1);
        strhash2 = addhash(strhash2,a[i],HASH_BASE,HASH_SIZE2);
    }
    f[strhash1][strhash2]++;
    int mx=1,put1 = pwr(HASH_BASE,len-1,HASH_SIZE1),put2 = pwr(HASH_BASE, len-1,HASH_SIZE2);
    for(int i=len+1;i<=n;i++)
    {
        strhash1 = removehash(strhash1,a[i-len],put1,HASH_SIZE1);
        strhash1 = addhash(strhash1,a[i],HASH_BASE,HASH_SIZE1);

        strhash2 = removehash(strhash2,a[i-len],put2,HASH_SIZE2);
        strhash2 = addhash(strhash2,a[i],HASH_BASE,HASH_SIZE2);
        f[strhash1][strhash2]++;
        mx=max(f[strhash1][strhash2],mx);
    }
    return mx >= k;
}
int main()
{
    fin >> n >> k;
    for(int i=1;i<=n;i++)
    {
        fin >> a[i];
    }
    int st=1,dr=n;
    while(st<=dr)
    {
        int m = (st + dr)/2;

        if(check(m))
        {
            st = m+1;
        }
        else
        {
            dr=m-1;
        }
    }
    fout << dr;
}