iscsi

SRM 509 D1 500

Jul 28th, 2011
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cctype>
  12. #include <cmath>
  13. #include <ctime>
  14. using namespace std;
  15. typedef long long LL;
  16. #define FOR(k,a,b) for(int k(a); k < (b); ++k)
  17. #define REP(k,a) for(int k=0; k < (a); ++k)
  18. #define ABCS 'z'-'a'+2
  19. #define EMPTY ABCS-1
  20. #define INF 1000000000
  21.  
  22. class PalindromizationDiv1 {
  23.     vector<vector<int> > dist;
  24.  
  25.     int getCost(const string& s1, const string& s2)
  26.     {
  27.         int mN=s1.size();
  28.         int mM=s2.size();
  29.         //edit distance s1 vs s2
  30.         vector<vector<int> > dp(mN+1,vector<int> (mM+1,INF));
  31.         dp[0][0]=0;
  32.         REP(i,mN+1)
  33.         REP(j,mM+1)
  34.         {
  35.             if(i<mN && j<mM && dp[i][j]+dist[s1[i]-'a'][s2[j]-'a']<dp[i+1][j+1])
  36.                 dp[i+1][j+1]=dp[i][j]+dist[s1[i]-'a'][s2[j]-'a'];
  37.             if(i<mN && dp[i][j]+dist[EMPTY][s1[i]-'a']<dp[i+1][j])
  38.                 dp[i+1][j]=dp[i][j]+dist[EMPTY][s1[i]-'a'];
  39.             if(j<mM && dp[i][j]+dist[EMPTY][s2[j]-'a']<dp[i][j+1])
  40.                 dp[i][j+1]=dp[i][j]+dist[EMPTY][s2[j]-'a'];
  41.         }
  42.         return dp[mN][mM];
  43.     }
  44.  
  45. public:
  46.     int getMinimumCost( string word, vector <string> op )
  47.     {
  48.         dist.resize(ABCS,vector<int>(ABCS,INF));
  49.         REP(i,op.size())
  50.         {
  51.             stringstream ss(op[i]);
  52.             string mop;
  53.             char c1=' ', c2=' ';
  54.             int tmp=0;
  55.             if(op[i][0]=='c')
  56.             {    
  57.                 ss >> mop >> c1 >> c2 >> tmp;
  58.                 dist[c1-'a'][c2-'a']=tmp;
  59.             }
  60.             else
  61.             {    
  62.                 ss >> mop >> c1 >> tmp ;
  63.                 if (mop[0]=='a')
  64.                 {
  65.                     dist[EMPTY][c1-'a']=tmp;
  66.                 }
  67.                 else
  68.                 {
  69.                     dist[c1-'a'][EMPTY]=tmp;
  70.                 }
  71.             }
  72.         }
  73.         REP(i,ABCS)
  74.             dist[i][i]=0;
  75.         //Floyd Warshall
  76.         REP(k,ABCS)
  77.         REP(i,ABCS)
  78.         REP(j,ABCS)
  79.         {
  80.             if(dist[i][j]>dist[i][k]+dist[k][j])
  81.                 dist[i][j]=dist[i][k]+dist[k][j];
  82.         }
  83.         //opt
  84.         vector<vector<int> > dist2=dist;
  85.         REP(k,ABCS)
  86.         REP(i,ABCS)
  87.         REP(j,ABCS)
  88.         {
  89.             if(dist2[i][j]>dist[i][k]+dist[j][k])
  90.                 dist2[i][j]=dist[i][k]+dist[j][k];
  91.         }
  92.         REP(i,ABCS)
  93.         REP(j,ABCS)
  94.         {
  95.             if(dist2[i][j]<dist2[j][i])
  96.                 dist2[i][j]=dist2[j][i];
  97.         }
  98.         dist2.swap(dist);
  99.         int n=word.size();
  100.         int best=INF;
  101.         REP(cut,n)
  102.         {
  103.             string s1=word.substr(0,cut),s2=word.substr(cut),s3=word.substr(cut+1);
  104.             reverse(s2.begin(),s2.end());
  105.             reverse(s3.begin(),s3.end());
  106.             int tmp=getCost(s1,s2);
  107.             if(tmp<best)
  108.                 best=tmp;
  109.             tmp=getCost(s1,s3);
  110.             if(tmp<best)
  111.                 best=tmp;
  112.         }
  113.         if(best>=INF)
  114.             return -1;
  115.         return best;
  116.     }
  117. };
Advertisement
Add Comment
Please, Sign In to add comment