Cod sursa(job #68970)

Utilizator crawlerPuni Andrei Paul crawler Data 30 iunie 2007 15:12:27
Problema ADN Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#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;
}