Cod sursa(job #1752415)

Utilizator DjokValeriu Motroi Djok Data 3 septembrie 2016 19:57:34
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<bits/stdc++.h>
using namespace std;

struct state {
  int len, link, cnt;
  map<char, int> next;
};

int i, last = 1, sz = 2, n, rs;
state sft[1000005];
string s;

void addLetter(int poz) {
  char c = s[poz];
  int p = last;

  while(p != -1 && c != s[poz - sft[p].len - 1]) p = sft[p].link;

  if(p == -1) return void(last = 1);

  if(sft[p].next.count(c)) last = sft[p].next[c], ++rs;
  else {
    int q = sz++;
    sft[q].len = sft[p].len + 2;
    sft[p].next[c] = q;
    p = sft[p].link;

    while(p !=-1 && c != s[poz - sft[p].len - 1]) p = sft[p].link;

    if(p == -1) p = 1; else p = sft[p].next[c];

    sft[q].link = p; last = q;
    sft[q].cnt = 1 + sft[p].cnt;
    rs += sft[q].cnt;
  }
}

int main()
{
  ios_base::sync_with_stdio(0);

  ifstream cin("pscpld.in");
  ofstream cout("pscpld.out");

  cin >> s; s = "#" + s;
  n = s.length();

  sft[0].len = sft[0].link = -1;

  for(i = 1; i < n; ++i) addLetter(i);

  cout << rs << '\n';

  return 0;
}