#include#include #include 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同意,禁止转载,侵权者必究。