Pagini recente » Cod sursa (job #1148129) | Cod sursa (job #680092) | Cod sursa (job #372680) | Cod sursa (job #1725630) | Cod sursa (job #2691424)
#include <fstream>
#include <string>
using namespace std;
const int NMAX = 1000000;
string input;
string sir = "";
long long sol;
long long lung[1 + 2 * NMAX + 1];
void extindere(int poz)
{
while (poz - lung[poz] >= 0 && poz + lung[poz] < sir.size() && sir[poz + lung[poz]] == sir[poz - lung[poz]])
{
lung[poz]++;
}
}
int main()
{
ifstream in("pscpld.in");
ofstream out("pscpld.out");
in >> input;
int lMax = 0;
int centruMax = -1;
for (int i = 0; i < input.size(); i++)
{
sir += '$';
sir += input[i];
}
sir += '$';
for (int i = 0; i < sir.size(); i++)
{
lung[i] = 1;
if (centruMax + lMax - 1 < i)
{
extindere(i);
}
else
{
int j = centruMax - (i - centruMax);
if (j - lung[j] + 1 > centruMax - lMax + 1)
{
lung[i] = lung[j];
}
else
{
lung[i] = centruMax + lMax - i;
extindere(i);
}
}
if (centruMax + lMax < i + lung[i])
{
centruMax = i;
lMax = lung[i];
}
sol += lung[i] / 2;
}
out << sol << '\n';
return 0;
}