Cod sursa(job #1007517)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 8 octombrie 2013 23:37:55
Problema Substr Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>
#include <cstring>
#include <map>
#define Mod1 2147483647
#define Base1 513
#define Nmax 16500
using namespace std;
int n,K;
char s[Nmax];
map<int ,int >a;
inline bool Verif(const int k)
{
    int i;
    long long Hash1 = 0,P = 1;
    a.clear();
    for(i = 1;i <= k; ++i)
    {
        Hash1 = (1LL*Hash1*Base1+1LL*s[i])%Mod1;
        if(i < k)
            P = (1LL*P*Base1)&Mod1;
    }
    if(++a[Hash1] == K)
        return true;
    for(i=k+1;i<=n;++i)
    {
        Hash1 = 1LL*((Hash1 - (1LL*s[i - k] * P) % Mod1 + 1LL*Mod1)*1LL * Base1 + s[i]) % Mod1;
        if(++a[Hash1] == K)
           return true;
    }
    return false;
}

int main()
{
    ifstream f("substr.in");
    f>>n>>K>>(s+1);
    f.close();
    int Left = 0,Right = n,Middle, sol = 0;
    while(Left<=Right)
    {
        Middle = (Left+Right)>>1;
        if(Verif(Middle))
        {
            sol = Middle;
            Left = Middle + 1;
        }
        else
            Right = Middle-1;
    }
    ofstream g("substr.out");
    g<<sol<<"\n";
    g.close();
    return 0;
}