Pagini recente » Cod sursa (job #1558135) | Cod sursa (job #2151077) | Cod sursa (job #2331573) | Cod sursa (job #698338) | Cod sursa (job #68970)
Cod sursa(job #68970)
#include <cstdio>
#include <string>
#include <algorithm>
#define Nmax 18
#define Lmax 30100
char s[Nmax][Lmax];
int pi[Nmax][Lmax], sz[Nmax];
int x[Nmax][Nmax];
int b[1<<18][18], n;
#define improve(a,b) if(a > b || a == 0) a = b;
void insert(int Y)
{
int stare = 1<<Y;
for (int nod=0;nod<n;++nod) if(x[nod][Y] != -1)
for (int biti=0;biti<(1<<18);++biti)
if(biti & stare == 0)
improve(b[biti^stare][Y],b[biti][nod] + x[nod][Y]);
}
int main()
{
freopen("adn.in","r",stdin);
freopen("adn.out","w",stdout);
scanf("%d\n",&n);
for (int i=0;i<n;++i)
{
fgets(s[i]+1,Lmax,stdin);
fputs(s[i]+1,stdout);
s[i][strlen(s[i]+1)] = 0;
//prefix :)
int k = 0;
sz[i] = strlen(s[i]+1);
pi[i][1] = 0;
printf("0 ");
for (int j=2;j<=sz[i];++j)
{
while (k > 0 && s[i][k+1] != s[i][j])
k = pi[i][k];
if (s[i][k+1] == s[i][j]) ++k;
pi[i][j] = k;
printf("%d ",pi[i][j]);
}
printf("\n");
}
printf("\n");
int ret = (1<<n)-1;
for (int i=0;i<n;++i)
for (int j=0;j<n;++j) if(i^j)
{
// potrivesc modelul j in sirul i... aka calc a[i][j] = inter lor ..
// -1 daca e inclus, + daca nu
int k = 0;
for (int q=1;q<=sz[i];++q)
{
while (k > 0 && s[j][k+1] != s[i][q])
k = pi[j][k];
if (s[j][k+1] == s[i][q]) ++k;
if (k == sz[j]) //inclus
{
printf("%d inclus in %d\n",j,i);
x[i][j] = -1;
ret ^= (1<<j);
break;
}
}
if(x[i][j] == 0) x[i][j] = k;
if(x[i][j] == k) printf("int %d %d = %d\n",i,j,k);
}
else
x[i][j] = -1;
for (int i=0;i<n;++i)
for(int j=0;j<n;++j)
insert(j);
return 0;
}