Cod sursa(job #2462352)

Utilizator cyg_contnr1Rares Burghelea cyg_contnr1 Data 27 septembrie 2019 10:11:47
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.94 kb

#include <stdio.h>
#include <string.h>
#define maxim 1000005

using namespace std;




int z[maxim * 2];

int main()
{
    freopen ("pscpld.in","r",stdin);
freopen ("pscpld.out","w",stdout);
    string s;
    char x;
    long long ans = 0;
    while (scanf("%c", &x));
    {
        s += "#";
        s += x;
        ans ++;

    }
    s = "!" + s + "#";
    int n = s.length();
    assert(n < 2 * maxim);
    int c = 0, r = 0;
    for (int i = 1; i < n; ++ i)
    {
       int op = 2 * c - i;
       if (i > r || z[op] >= r - i)
       {
           if (i > r)
               r = i;
           int k = r;
           while (k < n && s[k] == s[2 * i - k])
               k ++;
           k --;
           z[i] = k - i;
           if (k > c)
           {
               c = i;
               r = k;
           }
       }
       else
           z[i] = z[op];
       ans += z[i] / 2;
    }

    printf("%d", ans);
}