Pagini recente » Cod sursa (job #196025) | Cod sursa (job #1042896) | Cod sursa (job #269379) | Cod sursa (job #536399) | Cod sursa (job #3291964)
// Author: Tanasescu Andrei-Rares
/*
█████╗ ██████╗ ████████╗
██╔══██╗ ██╔══██╗╚══██╔══╝
███████║ ██████╔╝ ██║
██╔══██║ ██╔══██╗ ██║
██║ ██║ ██║ ██║ ██║
╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <iomanip>
#include <vector>
#include <cassert>
#pragma GCC optimize("O3")
#define fi first
#define se second
#define pb push_back
#define pf push_front
using namespace std;
ifstream fin ("pscpld.in");
ofstream fout ("pscpld.out");
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const ll Nmax=2e6+5, inf=1e9+5;
int n;
string init;
char s[Nmax];
int man[Nmax];
inline int expand(int pos, int len){
while (s[pos-len]==s[pos+len])
len++;
return len;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
fin>>init;
s[n++]+='!';
for (auto it:init){
s[n++]='#';
s[n++]=it;
}
s[n++]='#';
s[n++]='?';
int l=0, r=0;
for (int i=1; i<n; i++){
if (i>r){
man[i]=expand(i, 0);
l=i-man[i]+1;
r=i+man[i]-1;
}
else{
int j=l+r-i;
man[i]=min(man[j], r-i+1);
if (man[i]==r-i+1){
man[i]=expand(i, man[i]);
if (i+man[i]-1>r){
l=i-man[i]+1;
r=i+man[i]-1;
}
}
}
}
ll sol=0;
for (int i=1; i<n; i++)
sol+=man[i]/2;
fout<<sol;
return 0;
}