Advertisement
RaFiN_

lightoj superb sequence

Mar 16th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. /* you have 3 string a,b,c..find number of such strings which is a subsequence of c ans supersequence of a and b...length of such strings should be minimum possible....also find the lexicographycally minimum of those string */
  2.  
  3. char a[303],b[303],c[303];int ajinka;int dp[305][105][105],visitted[305][105][105];
  4.  
  5. int len1,len2,len3,len,nxt[305][50];int dp1[305][105][105];int f[50];string ans;
  6.  
  7. int findLen(int pos,int pos1,int pos2)
  8. {
  9.     if(pos1==len1&&pos2==len2)
  10.     {
  11.         if(pos<=len3)return 0;
  12.         else return inf/10;
  13.     }
  14.     if(pos>=len3)return inf/10;
  15.  
  16.     int &ret = dp[pos][pos1][pos2];
  17.     if(ret!=-1)return ret;
  18.  
  19.     ret = inf/10;
  20.     int y,z;
  21.     if(pos1<len1)
  22.     y = a[pos1] - 'a';
  23.     if(pos2<len2)
  24.     z = b[pos2] - 'a';
  25.     if(pos1<len1&&pos2<len2&&a[pos1]==b[pos2])
  26.     {
  27.         ret = min(ret,1+findLen(nxt[pos][y],pos1+1,pos2+1));
  28.     }
  29.     else {
  30.  
  31.         if(pos1<len1)ret = min(ret,1+findLen(nxt[pos][y],pos1+1,pos2));
  32.         if(pos2<len2)ret = min(ret,1+findLen(nxt[pos][z],pos1,pos2+1));
  33.     }
  34.     return ret;
  35. }
  36.  
  37. int giveres(int pos,int pos1,int pos2)
  38. {
  39.     if(pos1==len1&&pos2==len2)return (pos<=len3);
  40.     if(pos>=len3)return 0;
  41.  
  42.     int &ret = dp1[pos][pos1][pos2];
  43.     if(ret!=-1)return ret;
  44.     ret = 0;
  45.     int y,z;
  46.     if(pos1<len1)
  47.     y = a[pos1] - 'a';
  48.     if(pos2<len2)
  49.     z = b[pos2] - 'a';
  50.     if(pos1<len1&&pos2<len2&&a[pos1]==b[pos2]&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2+1]+1)
  51.     {
  52.         ret += giveres(nxt[pos][y],pos1+1,pos2+1);ret%=mod;
  53.  
  54.     }
  55.     else {
  56.  
  57.         if(pos1<len1&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2]+1)ret += giveres(nxt[pos][y],pos1+1,pos2);
  58.         ret%=mod;
  59.         if(pos2<len2&&dp[pos][pos1][pos2]==dp[nxt[pos][z]][pos1][pos2+1]+1)ret += giveres(nxt[pos][z],pos1,pos2+1);
  60.         ret%=mod;
  61.     }
  62.     return ret;
  63.  
  64. }
  65.  
  66. void print(int pos,int pos1,int pos2)
  67. {
  68.     if(pos1==len1&&pos2==len2)return ;
  69.     if(pos>=len3)return ;
  70.     int &v = visitted[pos][pos1][pos2];
  71.  
  72.     if(v==ajinka)return ;
  73.     v = ajinka;
  74.  
  75.     int y,z;
  76.     if(pos1<len1)
  77.     y = a[pos1] - 'a';
  78.     if(pos2<len2)
  79.     z = b[pos2] - 'a';
  80.     if(pos1<len1&&pos2<len2&&a[pos1]==b[pos2]&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2+1]+1)
  81.     {
  82.         ans+=a[pos1];
  83.         print(nxt[pos][y],pos1+1,pos2+1);
  84.     }
  85.     else {
  86.  
  87.         if(pos1<len1&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2]+1&&pos2<len2&&dp[pos][pos1][pos2]==dp[nxt[pos][z]][pos1][pos2+1]+1){
  88.  
  89.             if(a[pos1]<b[pos2])
  90.             {
  91.                 ans+=a[pos1];
  92.                 print(nxt[pos][y],pos1+1,pos2);
  93.             }
  94.             else {
  95.  
  96.                 ans+=b[pos2];
  97.                 print(nxt[pos][z],pos1,pos2+1);
  98.             }
  99.  
  100.         }
  101.         else if(pos1<len1&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2]+1)
  102.         {
  103.                 ans+=a[pos1];
  104.                 print(nxt[pos][y],pos1+1,pos2);
  105.         }
  106.         else if(pos2<len2&&dp[pos][pos1][pos2]==dp[nxt[pos][z]][pos1][pos2+1]+1){
  107.  
  108.             ans+=b[pos2];
  109.             print(nxt[pos][z],pos1,pos2+1);
  110.         }
  111.     }
  112.  
  113.  
  114. }
  115.  
  116. int main()
  117. {
  118.     ///booster()
  119.     ///read("input.txt");
  120.  
  121.     int t;
  122.     scani(t);
  123.     ajinka = 1;
  124.     while(t--)
  125.     {
  126.         ans.clear();
  127.         for(int i = 0;i<305;i++)for(int j = 0;j<102;j++)for(int k = 0;k<101;k++)dp[i][j][k] = dp1[i][j][k] = -1;
  128.         scanf(" %s%s%s",a,b,c);
  129.         len1 = strlen(a);
  130.         len2 = strlen(b);
  131.         len3 = strlen(c);
  132.         for(int i = 0;i<=50;i++)f[i] = inf/10;
  133.         for(int i = len3-1;i>=0;i--){
  134.             int x = c[i] - 'a';
  135.             f[x] = i;
  136.             int g = 'a';
  137.             int pnt = 0;
  138.             for(int ch = 0;ch<=25;ch++){
  139.  
  140.                 nxt[i][ch] = f[ch]+1;
  141.             }
  142.         }
  143.         len = findLen(0,0,0);
  144.         if(len>=inf/10)printf("Case %d: 0\nNOT FOUND\n",ajinka++);
  145.         else {
  146.             for(int i = 0;i<305;i++)for(int j = 0;j<102;j++)for(int k = 0;k<101;k++)if(dp[i][j][k]==-1)dp[i][j][k] = 0;
  147.             print(0,0,0);
  148.             printf("Case %d: %lld\n%s\n",ajinka++,giveres(0,0,0),ans.c_str());
  149.  
  150.         }
  151.     }
  152.  
  153.  
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement