Cod sursa(job #790476)

Utilizator toranagahVlad Badelita toranagah Data 21 septembrie 2012 16:01:16
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <string>
#include <iostream>

const int MAX_N = 1000005;

std::ifstream fin;
std::ofstream fout;
char s[2*MAX_N];
int l[2*MAX_N];
int N;
long long result;

inline int min(int a, int b) {
    return a > b ? b : a;
}
inline int max(int a, int b) {
    return a > b ? a : b;
}

int main(int argc, char const *argv[]) {
    fin.open("pscpld.in");
    N = 2;
    char ch;
    s[1] = '#';
    while (!fin.eof()) {
        fin.get(ch);
        s[N++] = ch;
        s[N++] = '#';
    }
    N -= 2;
    fin.close();

    int best = 0;
    for (int i = 1; i < N; ++i) {
      if (best + l[best] >= i) {
        l[i] = min(best + l[best] - i, l[2 * best - i]);
      }
      while (i - l[i] - 1 >= 0 && i + l[i] + 1 < N && 
             s[i - l[i] - 1] == s[i + l[i] + 1]) {
        ++l[i];
      }
      if (i + l[i] >= best + l[best]) {
        best = i;
      }
    }

    result = 0;
    for (int i = 1; i < N; ++i) {
      //std::cout << i << '-' << l[i] << ' ' << s[i] << '\n';
      if (i % 2 == 0)
        result += (l[i] + 1) / 2;
      else
        result += l[i] / 2;
      // if (i % 2 == 0) {
      //   result += ((l[i] - 1) / 2);
      // } else {
      //   result += (l[i] / 2);
      // }
    }

    fout.open("pscpld.out");
    fout << result;
    fout.close();
    return 0;
}