Pagini recente » Problema satisfiabilităţii formulelor logice de ordinul doi | Cod sursa (job #867898) | Cod sursa (job #2098981) | Cod sursa (job #3037879) | Cod sursa (job #1795718)
#include<cstdio>
#include<cstring>
#define mod1 100007
#define mod2 100021
int n,i,j,m,k,l1,l2,mid,o,vec[5],val[100008],minim=1000000;
char s[5][50001],c;
int main ()
{
freopen("subsecvente2.in","r",stdin);
freopen("subsecvente2.out","w",stdout);
scanf("%d%c",&n,&c);
for(i=1;i<=n;i++)
{
gets(s[i]);
vec[i]=strlen(s[i]);
if(vec[i]<minim)
minim=vec[i];
}
l1=1;
l2=minim;
while(l1<=l2)
{
mid=(l1+l2)/2;
int nr1=0,nr2=0,x=1,y=1;
for(i=0;i<mod1;i++)
val[i]=0;
for(i=0;i<mid;i++)
{
nr1=((nr1*123)%mod1+s[1][i])%mod1;
nr2=((nr2*123)%mod2+s[1][i])%mod2;
if(i!=0)
{
x=(x*123)%mod1;
y=(y*123)%mod2;
}
}
val[nr1]=1;
for(k=2;k<=n;k++)
{
int nrr1=0;
int nrr2=0;
int ppp=0;
for(i=0;i<mid;i++)
{
nrr1=(nrr1*123+s[k][i])%mod1;
nrr2=(nrr2*123+s[k][i])%mod2;
}
if(nrr1==nr1&&nrr2==nr2)
continue;
for(i=1;i<=vec[k]-mid;i++)
{
int x1,y1;
x1=(x*s[k][i-1])%mod1;
y1=(y*s[k][i-1])%mod2;
nrr1=(nrr1-x1+mod1)%mod1;
nrr2=(nrr2-y1+mod2)%mod2;
nrr1=(nrr1*123+s[k][i+mid-1])%mod1;
nrr2=(nrr2*123+s[k][i+mid-1])%mod2;
if(nrr1==nr1&&nrr2==nr2)
{
ppp=1;
break;
}
}
if(ppp==1)
continue;
k=n+3;
}
int ppp=0;
if(k==n+1)
ppp=1;
for(j=1;j<=vec[1]-mid&&ppp==0;j++)
{
int x1,y1;
x1=(x*s[1][j-1])%mod1;
y1=(y*s[1][j-1])%mod2;
nr1=(nr1-x1+mod1)%mod1;
nr2=(nr2-y1+mod2)%mod2;
nr1=(nr1*123+s[1][j+mid-1])%mod1;
nr2=(nr2*123+s[1][j+mid-1])%mod2;
if(val[nr1]==0)
{
val[nr1]=1;
for(k=2;k<=n;k++)
{
int nrr1=0;
int nrr2=0;
int ppp=0;
for(i=0;i<mid;i++)
{
nrr1=(nrr1*123+s[k][i])%mod1;
nrr2=(nrr2*123+s[k][i])%mod2;
}
if(nrr1==nr1&&nrr2==nr2)
continue;
for(i=1;i<=vec[k]-mid;i++)
{
int x1,y1;
x1=(x*s[k][i-1])%mod1;
y1=(y*s[k][i-1])%mod2;
nrr1=(nrr1-x1+mod1)%mod1;
nrr2=(nrr2-y1+mod2)%mod2;
nrr1=(nrr1*123+s[k][i+mid-1])%mod1;
nrr2=(nrr2*123+s[k][i+mid-1])%mod2;
if(nrr1==nr1&&nrr2==nr2)
{
ppp=1;
break;
}
}
if(ppp==1)
continue;
k=n+3;
}
if(k==n+1)
ppp=1;
}
}
if(ppp==0)
l2=mid-1;
else
{
o=mid;
l1=mid+1;
}
}
printf("%d",o);
return 0;
}