#include<iostream> #include<cstdio> #include<vector> #include<string> #include<queue> #include<cstring> #define maxn 1005 #define INF 0xfffffff #define rep0(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define mem(a,b) memset(a,b,sizeof(a)) #define FOR(i,s,t) for(int i=s;i<=t;i++) #define ull unsigned long long #define ll long long using namespace std; inline int rd(int &x) { char c=getchar(); while(!isdigit(c))c=getchar(); x=0; while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } return x; } int buf[10]; inline void ot(int i) { int p=0; if(i==0) p++; else while(i){ buf[p++]=i%10; i/=10;} for(int j=p-1;j>=0;j--) putchar('0'+buf[j]); } char A[maxn],B[maxn],C[maxn]; int a[maxn][maxn],b[maxn][maxn]; void fun(char *A,int m,char *B,int n,int a[][maxn]) { for(int i=0;i<=m;i++) a[i][0]=0; for(int i=0;i<=n;i++) a[0][i]=0; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(A[i-1]==B[j-1]) { a[i][j]=a[i-1][j-1]+1; // b[i][j]=0; } else if(a[i-1][j]>a[i][j-1]) { a[i][j]=a[i-1][j]; // b[i][j]=1; //行增加,为1 } else { a[i][j]=a[i][j-1]; // b[i][j]=-1; //列增加,为-1 } } } } void fun2(char *A,int m,char *B,int n,int a[][maxn]) { for(int i=0;i<=m+1;i++) a[i][0]=0; for(int i=0;i<=n+1;i++) a[0][i]=0; for(int i=m;i>=1;i--) { for(int j=n;j>=1;j--) { if(A[i-1]==B[j-1]) { a[i][j]=a[i+1][j+1]+1; // b[i][j]=0; } else if(a[i+1][j]>a[i][j+1]) { a[i][j]=a[i+1][j]; // b[i][j]=1; //行增加,为1 } else { a[i][j]=a[i][j+1]; // b[i][j]=-1; //列增加,为-1 } } } } struct edg { int l,r; }; edg x[maxn],y[maxn]; int main() { int t; scanf("%d",&t); int tt=1; while(t--) { scanf("%s%s%s",A,B,C); int la=strlen(A),lb=strlen(B),lc=strlen(C); //预处理求可行子序列 int s1=0,s2=0; for(int i=0;i<la;i++) { if(A[i]==C[0]) { int j=0,l=0; int ll1=i; while(j<lc&&i<la) { if(A[i]==C[j]) { l++; j++; if(l==lc) { break; } } i++; } if(l==lc) { x[s1].l=ll1+1,x[s1].r=i+1; s1++; } i=ll1; } } for(int i=0;i<lb;i++) { if(B[i]==C[0]) { int j=0,l=0; int ll1=i; while(j<lc&&i<lb) { if(B[i]==C[j]) { l++; j++; if(l==lc) { break; } } i++; } if(l==lc) { y[s2].l=ll1+1,y[s2].r=i+1; s2++; } i=ll1; } } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); fun(A,la,B,lb,a);//求出前缀子序列 fun2(A,la,B,lb,b);//求出后缀子序列 int ans=-1; for(int i=0;i<s1;i++) { for(int j=0;j<s2;j++) { int l1=x[i].l,r1=x[i].r; int l2=y[j].l,r2=y[j].r; ans=max(ans,a[l1-1][l2-1]+b[r1+1][r2+1]); } } printf("Case #%d: %d\n",tt++,ans+lc); } return 0; }