Pagini recente » Cod sursa (job #2037362) | Cod sursa (job #784677) | Cod sursa (job #1130356) | Cod sursa (job #1356271) | Cod sursa (job #2376503)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2 * 1e6 + 20;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
int manacher[MAXN];
char ch[MAXN];
void bruteforce(int i,int marime){
int l = 1;
while(ch[i + l] == ch[i - l] and i - l >= 0 and i + l <= marime) l++;
// fout << l << " " << i << '\n';
l--;
manacher[i] += 2 * l;
}
int main()
///cabana
{
ios::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
int marime = 0, best = 0;
long long maxim = 0;
char x;
for(int i = 0; i <= MAXN; ++i)
manacher[i] = 1;
while(fin.get(x) and x != '\n'){
ch[marime ++] = '*';
ch[marime ++] = x;
}
ch[marime] = '*';
for(int i = 1; i < marime; i += 2){
if(best + manacher[best] / 2 < i){
bruteforce(i, marime);
best = i;
continue;
}
manacher[i] = manacher[best - (i - best)];
if(best + manacher[best]/ 2 <= i + manacher[i] / 2 - 1){
manacher[i] = min(manacher[i], 2 * (best + manacher[best] / 2 - i) + 1);
bruteforce(i, marime);
best = i;
}
}
for(int i = 1; i <= marime; i += 2){
///fout << manacher[i] << '\n' ;
///fout << '\n' << (manacher[i] - 1) / 2;
maxim += (manacher[i] - 1) / 2;
}
fout << maxim;
return 0;
}