Cod sursa(job #1471440)

Utilizator akaprosAna Kapros akapros Data 13 august 2015 22:21:56
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define b 26
#define mod 46103
#define maxN 16386
using namespace std;
int n, k, v[maxN];
char s[maxN];
vector < int > V[mod];
void read()
{
    freopen("substr.in", "r", stdin);
    scanf("%d %d\n", &n, &k);
    gets(s + 1);
}
int scmp(int x, int y, int z)
{
    int i;
    for (i = 1; i <= z; ++ i)
        if (s[i + x] != s[i + y])
           return 0;
    return 1;
}
int in_hash(int x, int y, int z)
{
    int i, app = 0;
    for (i = 0; i < V[x].size(); ++ i)
        if (scmp(V[x][i], y, z))
           ++ app;
    return app;
}
void Clear()
{
    int i;
    for (i = 0; i <= mod; ++ i)
        V[i].clear();
}
int ok(int x)
{
    int i, powb = 1, nr = 0;
    for (i = 1; i < x; ++ i)
        powb = (powb * b) % mod;
    Clear();
    for (i = 1; i <= n; ++ i)
    {
        if (i > x)
            nr = (nr - ((powb * (s[i - x] - 'a')) % mod) + mod) % mod;
        nr = (nr * b + (s[i] - 'a')) % mod;
        while (nr < 0)
               nr += mod;
        if (i >= x)
            {
                v[i - x] = nr;
                V[nr].push_back(i - x);
                if (in_hash(v[i - x], i - x, x) >= k)
                    return 1;
            }
    }
    return 0;
}
int bs()
{
    int i = 0, p = 1 << 14;
    while (p)
    {
        if (i + p <= n && ok(i + p))
            i += p;
        p /= 2;
    }
    return i;
}
void write()
{
    freopen("substr.out", "w", stdout);
    printf("%d", bs());
}
int main()
{
    read();
    write();
    return 0;
}