这道题应该是三道里面最良心的一道题了吧。代码量和思维难度都比较小。
解法:用trie,先把每个串的长度扩到1000(500*2),然后对于每个点访问时cnt++,最后在所有cnt>1的点中找深度最深的那个,即为答案
证明:为什么扩到1000就一定正确呢?
懒癌晚期。。。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
short n,ans;
int Index;
char a[1005];
struct nod
{
int son[2];
short cnt,deep;
}s[20000005];
void build()
{
int now=0,len=strlen(a+1);
for(int i=1;i<=len;i++)
{
if(!s[now].son[a[i]-'0'])
{
s[now].son[a[i]-'0']=++Index;
s[Index].deep=s[now].deep+1;
}
now=s[now].son[a[i]-'0'];
s[now].cnt++;
}
}
int main()
{
freopen("string.in","r",stdin);freopen("string.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",a+1);
int len=strlen(a+1);
for(int j=1;j<=(1000-1)/len-1;j++)
for(int k=1;k<=len;k++)
a[j*len+k]=a[k];
build();
}
for(int i=1;i<=20000005;i++)
if(s[i].cnt>1)
ans=std::max(ans,s[i].deep);
printf("%d",ans);
}