Cod sursa(job #2462346)

Utilizator cyg_contnr1Rares Burghelea cyg_contnr1 Data 27 septembrie 2019 09:49:06
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <cstdio>
#include <cstring>
#define maxim 1000005

using namespace std;


freopen ("pscpld.in","r",stdin);
freopen ("pscpld.out","w",stdout);

int z[maxim * 2];

int main()
{
    string s;
    char x;
    long long ans = 0;
    while (scanf("%d", &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);
}