Codeforces and Polygon may be unavailable from December 6, 19:00 (UTC) to December 6, 21:00 (UTC) due to technical maintenance. ×

saisumit's blog

By saisumit, history, 9 years ago, In English

I am not able to figure out where i am getting wrong on this problem ...

https://www.codechef.com/problems/TACHEMIS

Your code here...


#include <bits/stdc++.h>


using namespace std;

#define pb push_back
#define ff first
#define ss second
typedef long long ll;




// Transform S into T.
// For example, S = "abba", T = "^#a#b#b#a#$".
// ^ and $ signs are sentinels appended to each end to avoid bounds checking
  vector<pair<char , long long >  > preProcess(  vector<pair<char , long long >  >& narr) {
  long long n = narr.size();
  vector<pair<char,long long > > arr ;
 // if (n == 0) return "^$";
  arr.pb(make_pair('^',0));

  for (long long i = 0; i < n; i++)
   { arr.pb(make_pair('#',0));
     arr.pb(make_pair(narr[i].ff , narr[i].ss)); }

  arr.pb(make_pair('#', 0));
  arr.pb(make_pair('$', 0));

  return arr;
}
void longestPalindrome(   vector<pair<char , long long >  > & arr ) {

    vector<pair<char , long long >  > T = preProcess(arr);

    long long n = T.size();
    long long *P = new long long [n];

     vector<ll>sum(n);

  long long C = 0, R = 0;
  for (long long i = 1; i < n-1; i++) {
   
    long long i_mirror = 2*C-i; // equals to i' = C - (i-C)

    P[i] = (R > i) ? min(R-i, P[i_mirror]) : 0;

    if( P[i] == R-i && R > i ) 
    for( int k = i + 1 ; k<= R - i ; k++ )
          sum[i]+=T[k].ss;
      
    else if(P[i] == P[i_mirror] && R > i )
         sum[i] = sum[i_mirror];
    
            // Attempt to expand palindrome centered at i
            while (T[i + 1 + P[i]].ff == T[i - 1 - P[i]].ff && T[i + 1 + P[i]].ss == T[i - 1 - P[i]].ss )
                        { sum[i] +=  T[i - 1 - P[i]].ss ;
                          P[i]++ ; }

            if((T[i + 1 + P[i]].ff == T[i - 1 - P[i]].ff ))
                          { sum[i] +=  min( T[i + 1 + P[i]].ss , T[i - 1 - P[i]].ss ) ;
                            P[i]++ ;
                             }

    // If palindrome centered at i expand past R,
    // adjust center based on expanded palindrome.
    if (i + P[i] > R) {
      C = i;
      R = i + P[i];
    }
  }
  long long ans = 0 ;

   for( long long i=0 ; i  < n ; i ++)
    {  if ( T[i].ff - 'A' >= 0 && T[i].ff - 'A' <=25)
          sum[i] += (T[i].ss) * (T[i].ss + 1) / 2 ;

         ans+=sum[i];
      // cout<< T[i].ff<<"  "<<T[i].ss<< " P[i]  "<< P[i] <<" Sum[i]  "<<sum[i]<<endl;

    }
 cout<<ans<<endl;


  delete[] P;

}

int  main()
{  cin.tie(0) ;
    long long t;
   string s;
   cin>> t;
   while(t--)
   { long long n ;
      cin >> n;
      string s;
      vector<pair<char , long long >  >arr(n) ;
      for(long long i = 0 ; i <n; i++)
       cin >> arr[i].ff >> arr[i].ss ;

      longestPalindrome(arr);

   }



}

  • Vote: I like it
  • 0
  • Vote: I do not like it