#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char c[105][105];
int f[30005],l[105],n,x[105];
inline int max(int a,int b){return a>b?a:b;}
int lcs(){
    for(int i=1;i<=n;i++)if(x[i]==0)return 0;
    int now=x[n]-1,ans=0,j;
    for(int i=n-1;i>=1;i--)now=now*l[i]+x[i]-1;
    if(f[now]>=0)return f[now];
    for(j=2;j<=n;j++)
        if(c[j][x[j]-1]!=c[1][x[1]-1])break;
    if(j>n){
        for(int i=1;i<=n;i++)x[i]--;
        ans=lcs()+1;
        for(int i=1;i<=n;i++)x[i]++;
    }
    else
        for(int i=1;i<=n;i++){
            x[i]--;ans=max(lcs(),ans);x[i]++;
        }
    return f[now]=ans;
}
int main()
{
    int T;scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",c[i]);
            l[i]=x[i]=strlen(c[i]);
        }
        memset(f,-1,sizeof(f));
        printf("%d\n",lcs());
    }
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

posted on 2017-08-01 20:42  Yzyet  阅读(149)  评论(0编辑  收藏  举报