Cod sursa(job #2901958)
Utilizator | Data | 14 mai 2022 22:36:42 | |
---|---|---|---|
Problema | PScPld | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.58 kb |
#include <fstream>
using namespace std;
ifstream cin("pscpld.in");
ofstream cout("pscpld.out");
int mn[2000005];
string s="*";
int main() {
long long S=0;
int L=-1,R=-1,m,mp,st=-1,dr=-1,left;
char c;
while(cin>>c) {
s+=c;
s+='*';
}
//cout<<s;
for(int i=0; i<s.size(); i++) {
if(i>R) {
st=dr=i;
while(st>0&&dr<s.size()-1&&(s[st-1]==s[dr+1])) {
mn[i]++;
st--;
dr++;
}
L=st;
R=dr;
} else {
m=(L+R)/2;
mp=2*m-i;
left=R-i;
if(mn[mp]<left)
mn[i]=mn[mp];
else {
mn[i]=R-i;
dr=R;
st=2*i-R;
while(st>0&&dr<s.size()-1&&(s[st-1]==s[dr+1])) {
mn[i]++;
st--;
dr++;
}
L=st;
R=dr;
}
}
}
for(int i=0; i<s.size(); i++)
S+=mn[i]/2;
cout<<S+s.size()/2;
return 0;
}