Cod sursa(job #2695851)

Utilizator sims_glAlexandru Simion sims_gl Data 14 ianuarie 2021 18:26:17
Problema Prefix Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<fstream>
#include<cstring>
#include<iostream>
#define P 73
#define MOD1 100007
#define MOD2 100021
#define N 1000005
using namespace std;

int i, nr = 0, H, H2, has, has2, v[N], v2[N], pow1[N], pow2[N], ma = 0;
char c[N];
int prefix(char m[], char n[], int l1)
{
    int l2 = strlen(n);
    nr = 0, H = 0, H2 = 0, has = 0, has2 = 0;

    for(int i = l1 * 2; i <= l2; i += l1)
    {
        has = (v[i] - (1ll * v[i - l1] * pow1[l1]) % MOD1 + MOD1) % MOD1;
        has2 = (v2[i] - (1ll * v2[i - l1] * pow2[l1]) % MOD2 + MOD2) % MOD2;
        if(!(has == v[l1] && has2 == v2[l1]))
        {
            if(i == l1 * 2)
                return 0;
            else
                return i - l1;
        }
    }
    if(l2 % l1 == 0)
        return l2;
    return l2 - l2 % l1;
}
int n, j;
int main()
{
    freopen("prefix.in", "r", stdin);
    freopen("prefix.out", "w", stdout);
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        scanf(" %s ", &c);
        int l1 = strlen(c);

        for(int j = 1 ; j <= l1 ; j++)
        {
            v[j] = (v[j - 1] * P + c[j - 1]) % MOD1;
            v2[j] = (v2[j - 1] * P + c[j - 1]) % MOD2;
        }
        pow1[0] = 1;
        pow2[0] = 1;
        for(int j = 1; j < l1; j ++)
        {
            pow1[j] = (pow1[j - 1] * P) % MOD1;
            pow2[j] = (pow2[j - 1] * P) % MOD2;
        }
        for(j = l1 / 2 ; j > 0; j--)
        {
            ma = max(prefix(c, c, j), ma);

        }
        cout << ma << endl;
        ma=0;
    }
}