#include <algorithm> #include <cstring> #include <cstdio> using std::max; char s[1010]; char s2[1010]; char str[1010]; int dp[1010][1010]; int dp1[1010][1010]; int vis[1010]; int vis1[1010]; int len,lens; void solve1() { int len1=strlen(str); int mm=0,j; for(int i=1; i<=len; i++) { mm=0; if(str[0]==s[i]) { for(j=i; j<=len; j++) { if(str[mm]==s[j]) mm++; if(mm==len1) { vis[i]=j; break; } } if(mm!=len1) vis[i]=0; } else vis[i]=0; } } void solve2() { int len1=strlen(str); int mm=0,j; for(int i=1; i<=lens; i++) { if(str[0]==s2[i]) { mm=0; for(j=i; j<=lens; j++) { if(str[mm]==s2[j]) mm++; if(mm==len1) { vis1[i]=j; break; } } if(mm!=len1) vis1[i]=0; } else vis1[i]=0; } } int main() { int t,cas=0; scanf("%d",&t); getchar(); while(t--) { cas++; scanf("%s%s%s",s+1,s2+1,str); len=strlen(s+1); lens=strlen(s2+1); solve1(); solve2(); memset(dp, 0, sizeof(dp)); memset(dp1, 0, sizeof(dp1)); for(int i=1; i<=len; i++) for(int j=1; j<=lens; j++) if(s[i]==s2[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); for(int i=len; i>=1; i--) for(int j=lens; j>=1; j--) if(s[i]==s2[j]) dp1[i][j]=dp1[i+1][j+1]+1; else dp1[i][j]=max(dp1[i+1][j],dp1[i][j+1]); int mx=-1; for(int i=1; i<=len; i++) for(int j=1; j<=lens; j++) { if(vis[i] && vis1[j] && mx<dp[i-1][j-1]+dp1[vis[i]+1][vis1[j]+1]) mx=dp[i-1][j-1]+dp1[vis[i]+1][vis1[j]+1]; } printf("Case #%d: %d\n",cas,mx+strlen(str)); } return 0; }