Pagini recente » Cod sursa (job #1564456) | Cod sursa (job #2343828) | Cod sursa (job #468709) | Cod sursa (job #560348) | Cod sursa (job #2897623)
#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;
}