Cod sursa(job #2897623)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 4 mai 2022 12:07:07
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("ghicit.in");
ofstream fout("ghicit.out");

const int NMAX = 50211, LOGMAX = 17;

struct pack {
  short int nr1, nr2, ind;

  public: bool operator <(const pack &a) {
    if (nr1 == a.nr1)
      return nr2 < a.nr2;
    return nr1 < a.nr1;
  }
  public: bool operator ==(const pack &a) {
    return (nr1 == a.nr1 && nr2 == a.nr2);
  }
};


int suffmat[NMAX + (1 << LOGMAX) + 1][LOGMAX];
short int sint[NMAX + (1 << LOGMAX) + 1];
unsigned char s[NMAX + 1];

void initSuff(int n);
int solve(int n);

int main()
{
  fin >> s;
  int n = 0;
  for (n = 0; s[n] != '\0'; n++)
    sint[n] = s[n];

  for (int i = n; i <= NMAX + (1 << LOGMAX); i++)
    sint[i] = -1;

  initSuff(n);
  fout << (long long)n * (n - 1) / 2 - solve(n);
  return 0;
}

void initSuff(int n) {
  /// this works bismillah inshallah
  pack suffs[NMAX + 1];
  suffs[n] = {-1, -1, -1};
  for (int i = 0; i < n; i++)
    suffs[i] = {sint[i], 0, i};

  int p;
  for (p = 0; (1 << p) <= n; p++) {
    int ind = 0;
    sort(suffs, suffs + n);

    for (int i = 0; i < n; i++) {

      while (suffs[i] == suffs[i + 1]) {
        suffmat[suffs[i].ind][p] = ind;
        i++;
      }

      suffmat[suffs[i].ind][p] = ind++;
    }

    for (int i = 0; i < n; i++)
      suffs[i] = {suffmat[i][p], suffmat[i + (1 << p)][p], i};
  }
  for (int i = p; i < LOGMAX; i++)
    for (int j = 0; j < n; j++)
      suffmat[j][i] = j;
}

int solve(int n) {
  int nrbad = 0;

  for (int i = 0; i < n - 1; i++) {
    int j = i;
    for (int p = LOGMAX - 1; p >= 0; p--)
      if (suffmat[j][p] == suffmat[j + 1][p] && j + (1 << p) <= n)
        j += (1 << p);
    nrbad += j - i;
  }
  return nrbad;
}