Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* 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 */
- char a[303],b[303],c[303];int ajinka;int dp[305][105][105],visitted[305][105][105];
- int len1,len2,len3,len,nxt[305][50];int dp1[305][105][105];int f[50];string ans;
- int findLen(int pos,int pos1,int pos2)
- {
- if(pos1==len1&&pos2==len2)
- {
- if(pos<=len3)return 0;
- else return inf/10;
- }
- if(pos>=len3)return inf/10;
- int &ret = dp[pos][pos1][pos2];
- if(ret!=-1)return ret;
- ret = inf/10;
- int y,z;
- if(pos1<len1)
- y = a[pos1] - 'a';
- if(pos2<len2)
- z = b[pos2] - 'a';
- if(pos1<len1&&pos2<len2&&a[pos1]==b[pos2])
- {
- ret = min(ret,1+findLen(nxt[pos][y],pos1+1,pos2+1));
- }
- else {
- if(pos1<len1)ret = min(ret,1+findLen(nxt[pos][y],pos1+1,pos2));
- if(pos2<len2)ret = min(ret,1+findLen(nxt[pos][z],pos1,pos2+1));
- }
- return ret;
- }
- int giveres(int pos,int pos1,int pos2)
- {
- if(pos1==len1&&pos2==len2)return (pos<=len3);
- if(pos>=len3)return 0;
- int &ret = dp1[pos][pos1][pos2];
- if(ret!=-1)return ret;
- ret = 0;
- int y,z;
- if(pos1<len1)
- y = a[pos1] - 'a';
- if(pos2<len2)
- z = b[pos2] - 'a';
- if(pos1<len1&&pos2<len2&&a[pos1]==b[pos2]&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2+1]+1)
- {
- ret += giveres(nxt[pos][y],pos1+1,pos2+1);ret%=mod;
- }
- else {
- if(pos1<len1&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2]+1)ret += giveres(nxt[pos][y],pos1+1,pos2);
- ret%=mod;
- if(pos2<len2&&dp[pos][pos1][pos2]==dp[nxt[pos][z]][pos1][pos2+1]+1)ret += giveres(nxt[pos][z],pos1,pos2+1);
- ret%=mod;
- }
- return ret;
- }
- void print(int pos,int pos1,int pos2)
- {
- if(pos1==len1&&pos2==len2)return ;
- if(pos>=len3)return ;
- int &v = visitted[pos][pos1][pos2];
- if(v==ajinka)return ;
- v = ajinka;
- int y,z;
- if(pos1<len1)
- y = a[pos1] - 'a';
- if(pos2<len2)
- z = b[pos2] - 'a';
- if(pos1<len1&&pos2<len2&&a[pos1]==b[pos2]&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2+1]+1)
- {
- ans+=a[pos1];
- print(nxt[pos][y],pos1+1,pos2+1);
- }
- else {
- 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){
- if(a[pos1]<b[pos2])
- {
- ans+=a[pos1];
- print(nxt[pos][y],pos1+1,pos2);
- }
- else {
- ans+=b[pos2];
- print(nxt[pos][z],pos1,pos2+1);
- }
- }
- else if(pos1<len1&&dp[pos][pos1][pos2]==dp[nxt[pos][y]][pos1+1][pos2]+1)
- {
- ans+=a[pos1];
- print(nxt[pos][y],pos1+1,pos2);
- }
- else if(pos2<len2&&dp[pos][pos1][pos2]==dp[nxt[pos][z]][pos1][pos2+1]+1){
- ans+=b[pos2];
- print(nxt[pos][z],pos1,pos2+1);
- }
- }
- }
- int main()
- {
- ///booster()
- ///read("input.txt");
- int t;
- scani(t);
- ajinka = 1;
- while(t--)
- {
- ans.clear();
- 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;
- scanf(" %s%s%s",a,b,c);
- len1 = strlen(a);
- len2 = strlen(b);
- len3 = strlen(c);
- for(int i = 0;i<=50;i++)f[i] = inf/10;
- for(int i = len3-1;i>=0;i--){
- int x = c[i] - 'a';
- f[x] = i;
- int g = 'a';
- int pnt = 0;
- for(int ch = 0;ch<=25;ch++){
- nxt[i][ch] = f[ch]+1;
- }
- }
- len = findLen(0,0,0);
- if(len>=inf/10)printf("Case %d: 0\nNOT FOUND\n",ajinka++);
- else {
- 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;
- print(0,0,0);
- printf("Case %d: %lld\n%s\n",ajinka++,giveres(0,0,0),ans.c_str());
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement