Pagini recente » Cod sursa (job #76587) | Cod sursa (job #1379083) | Cod sursa (job #2873142) | Cod sursa (job #58909) | Cod sursa (job #667663)
Cod sursa(job #667663)
#include<fstream>
#include<algorithm>
#define infile "pscpld.in"
#define outfile "pscpld.out"
#define n_max 2000005
using namespace std;
char S[n_max];
int Lung[n_max];
int N;
long long sol;
void citeste()
{
ifstream fin(infile);
while (fin >> S[2 * N + 1])
N ++;
fin.close();
}
void rezolva()
{
int idx = 1;
for (int i=1; i<2*N; ++i)
{
if (idx + Lung[idx] - 1 < i)
Lung[i] = i&1;
else
Lung[i] = min(Lung[idx - (i - idx)], idx + Lung[idx] - i );
int j = Lung[i] + 1;
while (i - j >= 1 && i + j < 2*N && S[i-j] == S[i+j])
j+=2;
j -= 2;
Lung[i] = j + 1;
if ( i + Lung[i] > idx + Lung[idx])
idx = i;
sol += (Lung[i] + 1) / 2;
}
}
void afiseaza()
{
ofstream fout(outfile);
fout<<sol<<'\n';
fout.close();
}
int main(void)
{
citeste();
rezolva();
afiseaza();
return 0;
}