题意:

n<=10,len<=1e4

思路:

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 210000
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 1000000000 char ch[N]; int n,i,s[N],sa[N],wa[N],wb[N],wc[N],wd[N],height[N],rank[N],
a[N],b[N],c[N],d[N],num[N],M; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} bool cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
} void getsa(int *r,int *sa,int n,int m)
{
int *x=wa,*y=wb,j,p;
for(i=;i<n;i++) wc[x[i]=r[i]]++;
for(i=;i<m;i++) wc[i]+=wc[i-];
for(i=n-;i>=;i--) sa[--wc[x[i]]]=i;
for(j=,p=;p<n;j*=,m=p)
{
p=;
for(i=n-j;i<n;i++) y[p++]=i;
for(i=;i<n;i++)
if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=;i<n;i++) wd[i]=x[y[i]];
for(i=;i<m;i++) wc[i]=;
for(i=;i<n;i++) wc[wd[i]]++;
for(i=;i<m;i++) wc[i]+=wc[i-];
for(i=n-;i>=;i--) sa[--wc[wd[i]]]=y[i];
swap(x,y);
p=; x[sa[]]=;
for(i=;i<n;i++) x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
} void getheight(int *r,int *sa,int n)
{
int i,j,k=;
for(i=;i<=n;i++) rank[sa[i]]=i;
for(i=;i<n;height[rank[i++]]=k)
{
if(k) k--;
j=sa[rank[i]-];
while(r[i+k]==r[j+k]) k++;
}
} void init()
{
memset(s,,sizeof(s));
memset(sa,,sizeof(sa));
memset(wa,,sizeof(wa));
memset(wb,,sizeof(wb));
memset(wc,,sizeof(wc));
memset(wd,,sizeof(wd));
memset(height,,sizeof(height));
memset(rank,,sizeof(rank));
} bool isok(int K)
{
int i=;
while(i<n)
{
i++;
if(height[i]>=K)
{
int st=i;
while(i<=n&&height[i]>=K) i++;
if(st<=i-)
{
int ed=i-;
for(int j=;j<=M;j++)
{
b[j]=;
c[j]=oo;
d[j]=-oo;
}
for(int j=st-;j<=ed;j++)
{
int t=num[sa[j]];
b[t]++;
c[t]=min(c[t],sa[j]);
d[t]=max(d[t],sa[j]);
}
int flag=;
for(int j=;j<=M;j++)
{
if(b[j]<){flag=; break;}
if(d[j]-c[j]<K){flag=; break;}
}
if(flag) return ;
}
}
}
return ;
} int main()
{
freopen("spoj220.in","r",stdin);
freopen("spoj220.out","w",stdout);
int cas;
scanf("%d",&cas);
while(cas--)
{
init();
scanf("%d",&M);
n=-;
for(int i=;i<=M;i++)
{
scanf("%s",ch);
int t=strlen(ch);
for(int j=;j<t;j++)
{
s[++n]=ch[j]-'a'+;
num[n]=i;
}
s[++n]=i;
num[n]=;
}
getsa(s,sa,n+,);
getheight(s,sa,n);
// printf("1\n");
int L=;
int R=;
int last=;
while(L<=R)
{
int mid=(L+R)>>;
if(isok(mid)){last=mid; L=mid+;}
else R=mid-;
}
printf("%d\n",last);
}
return ;
}

最新文章

  1. Linq to Sql : 并发冲突及处理策略
  2. 代码回滚:git reset、git checkout和git revert区别和联系
  3. 我的PhoneGap安装配置经历
  4. Http错误 404.3-Not Found....或者500.19 Internal Server Error
  5. 课堂所讲整理:Set和Map
  6. CSS框架分析与网站的CSS架构
  7. SharePoint 2013 中使用 JavaScript Like 和Unlike list item/page/document
  8. 解决BLOB/TEXT column can&#39;t have a default value query问题
  9. java的for循环问题的解决,以及安卓中ListView插入数据的问题
  10. leetcode第一刷_Largest Rectangle in Histogram
  11. css学习之 display:inline-block;
  12. C++测试利器--google test开源测试框架
  13. 编程那些事儿:如何快速地&quot;借用&quot;CSS
  14. 4.sass的分支结构、循环结构、函数
  15. 『字符串模式匹配 KMP』
  16. 英语口语练习系列-C04-学校生活
  17. 第47章:MongoDB-用户管理
  18. 读书笔记(chapter3)
  19. Linq 中的 in 与 not in 的使用
  20. 01List.ashx(班级列表动态页面)

热门文章

  1. Django 表增加外键
  2. UVA 1664 Conquer a New Region (Kruskal,贪心)
  3. BestCoder Round#15 1002-Instruction
  4. NoSuchBeanDefinitionException: No qualifying bean of type &#39;com.bj186.ssm.mapper.EmployeeMapper&#39; available: expected at least 1 bean which qualifies as autowire candidate
  5. Java创建图片文件缩略图
  6. 用事件队列解决GUI的操作顺序问题(Qt中处理方法)
  7. Windows 10 Mac 为Vs Code配置C/C++环境
  8. modelsim安装调试
  9. 数据结构( Pyhon 语言描述 ) — — 第5章:接口、实现和多态
  10. Python9-继承2-day25(大年初二)