Cod sursa(job #2360131)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 1 martie 2019 13:04:42
Problema Prefix Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <cstring>

#define crypt 256
#define MOD1 100007
#define MOD2 100021
#define NMAX 1000005
using namespace std;

ifstream fin("prefix.in");
ofstream fout("prefix.out");

char sir[NMAX];
int h1 = 1, h2 = 1, lgT = 0;

int Rabin_karp(int lg){
    int hs1 = 0;
    int hs2 = 0;
    for(int i = 0; i < lg; ++i){
        hs1 = (hs1 * crypt + sir[i]) % MOD1;
        hs2 = (hs2 * crypt + sir[i]) % MOD2;
    }

    int sh1 = hs1;
    int sh2 = hs2;
    int rez = 0;
    int times = 0;
    int bad = 0;
    for(int i = 0; i <= lgT - lg; ++i){
        if(sh1 == hs1 && sh2 == hs2 && (bad == lg - 1 || i == 0))
            rez += lg, ++times, bad = 0;
        else {
            ++bad;
            if(bad == lg)
                break;
        }
        sh1 = (crypt * (sh1 - (sir[i] * h1) % MOD1 + MOD1) + sir[i + lg]) % MOD1;
        sh2 = (crypt * (sh2 - (sir[i] * h2) % MOD2 + MOD2) + sir[i + lg]) % MOD2;
    }
    if(times >= 2)
        return rez;
    return 0;
}

int main()
{
    int t;
    fin >> t;

    fin.get();
    while(t--){
        fin.getline(sir, NMAX - 1);
        lgT = strlen(sir);

        int maxx = 0;
        for(int i = 2; i < lgT; ++i){
            for(int j = 1; j < i; ++j){
                h1 = (h1 * crypt) % MOD1;
                h2 = (h2 * crypt) % MOD2;
            }
            int lgPrefi = Rabin_karp(i);
            h1 = 1;
            h2 = 1;
            maxx = max(maxx, lgPrefi);
        }
        fout << maxx << '\n';
    }
    return 0;
}