Advertisement
Guest User

dasdas

a guest
Jun 19th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. string s,b;
  4. long long n,w;
  5. vector <int> manacher(string a,int dl)
  6. {
  7.     vector <int> promienie(dl);
  8.     int srodek=0,prawy=-1,promien=0;
  9.     for(int i=0;dl>i;i++)
  10.     {
  11.         if(i<=prawy)
  12.            promien=min(prawy-i,promienie[2*srodek-i]);
  13.         else
  14.            promien=0;
  15.         while(i+promien<dl and i-promien>=0 and a[i-promien]==a[i+promien])
  16.             {promien++;}
  17.         promienie[i]=promien-1;
  18.         if(i+promien>=prawy)
  19.         {
  20.             srodek=i;
  21.             prawy=i+promien-1;
  22.         }
  23.     }
  24.     return promienie;
  25. }
  26. int main()
  27. {
  28. cin>>s;
  29. n=s.size();
  30. int j=0;
  31. for(int i=0;2*n-1>i;i++)
  32.     b.push_back('#');
  33.     for(int i=0;s.size()>i;i++)
  34. {
  35.    b[j++]=s[i];
  36.    if(i!=n-1)
  37.     {b[j++]='#';}
  38. }
  39.  
  40. n=b.size();
  41. vector <int> wynik=manacher(b,n);
  42. for(int i=0;n>i;i++)
  43.  {
  44.  
  45.      if(i%2==0)
  46.         {
  47.             w+=wynik[i]/2;
  48.         }
  49.      else
  50.      {
  51.             w+=ceil((double)wynik[i]/2);
  52.      }
  53.  }
  54.  cout<<w+b.size()/2+1;
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement