#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t,n;const int N=105;
char s[N][30];int tot=0;
char ch[N*10000];int sz[N];
int vis1[30],vis2[30],cnt=0;
ll gcd(ll a, ll b){
return b == 0 ? a : gcd(b, a % b);
}
string S;
void build(){
int pos=0,fl=1;tot=0;
memset(vis1,0,sizeof vis1);cnt=0;
int pos2=0;
int high=1;
for(int i=1;i<=n;i++){
high=(high*sz[i])/gcd(high,sz[i]);
}
while(1){
fl=0;
for(int i=1;i<=n;i++){
pos=pos2%sz[i];
if(vis1[s[i][pos]-'a']==0) cnt++;
vis1[s[i][pos]-'a']=1;
S+=s[i][pos];
ch[++tot]=s[i][pos];
}
++pos2;
if(pos2==2*high) break;
}
// for(int i=1;i<=20;i++) cout<<ch[i];cout<<endl;
}
int ans=1e9+10;
int solve(string str) {
memset(vis1,0,sizeof vis1);
int l=0,r=0,res=1e9,cn=0;
while(l<str.size()&&r<str.size()){
while(r<str.size()&&cn<cnt){
int tmp=str[r]-'a';
if(vis1[tmp]==0) cn++;
vis1[tmp]++;
r++;
}
int fl=0;
if(cnt==cn) fl=1;
else break;
while(l<r&&cn==cnt){
int tmp=str[l]-'a';
vis1[tmp]--;if(vis1[tmp]==0) cn--;
l++;
}
if(fl==1) res=min(res,r-l+1);
}
return res;
}
int32_t main(){
scanf("%d",&t);
while(t--){
ans=1e9;
scanf("%d",&n);S="";
for(int i=1;i<=n;i++) scanf("%s",s[i]),sz[i]=strlen(s[i]);
build();S+=S;
cout<<solve(S)<<endl;
}
}
ccpc选拔赛 Time-division Multiplexing(尺取
最新推荐文章于 2022-03-25 19:06:53 发布