Cod sursa(job #3334079)

Utilizator Rradu_v2Catana Radu Rradu_v2 Data 16 ianuarie 2026 10:03:39
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>

#define BAZA 998244353
#define MOD 1000000007
#define MAX_N 1000000
unsigned long long bazapower[MAX_N/2];
unsigned long long enc[MAX_N];

int main()
{
    FILE *fin = fopen("prefix.in", "r");
    FILE *fout = fopen("prefix.out", "w");
    int q, i, j, l, n, val, maxl=0, ok;
    unsigned long long key, x1, x2, xf;
    char ch;

    bazapower[0] = BAZA%MOD;
    for(i=1; i<MAX_N/2; i++)
        bazapower[i] = bazapower[i-1]*(BAZA%MOD)%MOD;

    fscanf(fin, "%d ", &q);

    for(i=0; i<q; i++) {
        n = 0;
        ch = fgetc(fin);
        enc[0] = (ch-'0')%MOD;
        while(ch!='\n' && ch!=EOF) {
            val = ch-'0';
            if(n!=0)
                enc[n] = (enc[n-1]*BAZA%MOD+val)%MOD;
            n++;
            ch = fgetc(fin);
        }

        maxl = 0;
        for(l=0; l<n/2; l++) {
            //fprintf(fout, "l:%d  ", l);
            key = enc[l];
            val = 1;
            j = l+1;
            ok = 0;
            while(ok==0 && j+l<n) {
                x1 = enc[j+l];
                x2 = enc[j-1]*bazapower[l]%MOD;
                xf = (x1-x2+MOD)%MOD;
                if(xf==key) {
                    //fprintf(fout, "%d ", j);
                    val++;
                }
                else
                    ok = 1;
                j+=l+1;
            }

            if(val>1 && val*(l+1)>maxl)
                maxl = val*(l+1);
            //fprintf(fout, "val:%d\n", val);
        }
        fprintf(fout, "%d\n", maxl);

        //for(j=0; j<n; j++)
        //    fprintf(fout, "%llu ", enc[j]);
        //fprintf(fout, "\n");
    }


    fclose(fin);
    fclose(fout);
    return 0;
}