Pagini recente » Cod sursa (job #2704472) | Cod sursa (job #506856) | Cod sursa (job #1178766) | Cod sursa (job #2970414) | Cod sursa (job #2023273)
#include <fstream>
using namespace std;
ifstream cin("pscpld.in");
ofstream cout("pscpld.out");
int poli[1000100];
int main() {
string s;
cin>>s;
string sir;
//sir += s[0];
for (int i=0; i<s.size(); i++){
sir += '#';
sir += s[i];
}
sir += '#';
//cout<<sir<<'\n';
int pos = 0;
for (auto &x : poli){
x++;
}
for (int i=1; i<=sir.size(); i++){
//cout<<"pos "<<i<<" "<<pos<<'\n';
if (pos * 2 - i >= 0 && pos * 2 - i - poli[ pos * 2 - i] > pos - poli[pos]){
//cout<<"intru "<<i<<" "<<pos<<'\n';
poli[i] = poli[ pos * 2 - i];
continue;
}
int intrare = i+1;
if (pos + poli[pos] - 1 > i){
//cout<<"intru "<<i<<" "<<pos<<" "<<pos + poli[pos] - 1 - i<<'\n';
intrare = i + 1 + pos + poli[pos] - 1 - i;
poli[i] += pos + poli[pos] - 1 - i;
}
//cout<<"bag"<<'\n';
for (int j=intrare; j<=sir.size(); j++){
if (2 * i - j >= 0 && sir[j] == sir[ 2 * i - j]){
poli[i]++;
}
else{
break;
}
}
pos = i;
}
/*for (int i=0; i<sir.size(); i++){
cout<<poli[i]<<" ";
}
cout<<'\n';
for (int i=1; i<sir.size(); i+=2){
cout<<poli[i] / 2<<" ";
}*/
int cont = 0;
for (int i=0; i<sir.size(); i++){
if (sir[i + poli[i] - 1] != '#'){
poli[i] ++;
}
//cout<<poli[i] / 2<<" ";
cont += poli[i] / 2 ;
}
cout<<cont;
return 0;
}