Cod sursa(job #68969)

Utilizator crawlerPuni Andrei Paul crawler Data 30 iunie 2007 15:01:16
Problema ADN Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 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 main()
{
	freopen("adn.in","r",stdin);
	freopen("adn.out","w",stdout);
	
	int n;
	
	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");

	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;
					break;
				}
			}
			if(x[i][j] == 0) x[i][j] = k;
			if(x[i][j] == k) printf("int %d %d = %d\n",i,j,k);
		}

	return 0;
}