Cod sursa(job #2456559)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 14 septembrie 2019 17:58:25
Problema PScPld Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <bits/stdc++.h>
#define maxim 1000005
using namespace std;

ifstream f("pscpld.in");
ofstream g("pscpld.out");

int z[maxim * 2];

int main()
{
    string s;
    char x;
    long long ans = 0;
    while (f >> 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];
    }
    for (int i = 1; i < n; ++ i)
        ans += z[i] / 2;
    g << ans;
}