Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- string s,b;
- long long n,w;
- vector <int> manacher(string a,int dl)
- {
- vector <int> promienie(dl);
- int srodek=0,prawy=-1,promien=0;
- for(int i=0;dl>i;i++)
- {
- if(i<=prawy)
- promien=min(prawy-i,promienie[2*srodek-i]);
- else
- promien=0;
- while(i+promien<dl and i-promien>=0 and a[i-promien]==a[i+promien])
- {promien++;}
- promienie[i]=promien-1;
- if(i+promien>=prawy)
- {
- srodek=i;
- prawy=i+promien-1;
- }
- }
- return promienie;
- }
- int main()
- {
- cin>>s;
- n=s.size();
- int j=0;
- for(int i=0;2*n-1>i;i++)
- b.push_back('#');
- for(int i=0;s.size()>i;i++)
- {
- b[j++]=s[i];
- if(i!=n-1)
- {b[j++]='#';}
- }
- n=b.size();
- vector <int> wynik=manacher(b,n);
- for(int i=0;n>i;i++)
- {
- if(i%2==0)
- {
- w+=wynik[i]/2;
- }
- else
- {
- w+=ceil((double)wynik[i]/2);
- }
- }
- cout<<w+b.size()/2+1;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement