Cod sursa(job #20868)

Utilizator peanutzAndrei Homorodean peanutz Data 22 februarie 2007 15:46:30
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <stdio.h>
#include <string.h>
#include <memory.h>

#define NMAX 267
#define KMAX 520

typedef struct cuv
{
char c[NMAX];
};

cuv p[NMAX][NMAX];
int a[NMAX][KMAX];
int len[NMAX][NMAX];
int n, k;
int nr[NMAX];

int conf[NMAX], h;

void read()
{
int i, j;
char linie[NMAX];
int last;

scanf("%d %d\n", &n, &k);

for(i = 0; i < n; ++i)
	{
		fgets(linie, NMAX, stdin);

		last = 0;
		nr[i] = 1;


		for(j = 0; linie[j] != '\n'; ++j)
			{
				if(linie[j] == ' ')
					{
						p[i][nr[i]].c[last] = '\0';

						if(i != 0 )
							++len[i][nr[i]];

						len[i][nr[i]++] += last;
						last = 0;

					}
				else
					p[i][nr[i]].c[last++] = linie[j];
			}
		p[i][nr[i]].c[last] = '\0';


		if(i != 0)
			++len[i][nr[i]];

		 len[i][nr[i]++] = last;

	}
}

void print_p()
{
int i, j;

for(i = 0; i < n; ++i)
	{
		for(j = 0; j < nr[i]; ++j)
			{
				fputs(p[i][j].c, stdout);
				printf(" %d ", len[i][j]);
			}

		printf("\n");
	}
}

void dinamic()
{
int c1[KMAX], c2[KMAX];
int i, j, k;
int next;

for(i = 1, c1[0] = 0; i < nr[0]; ++i)
	{
		if(len[0][i] < KMAX)
			{
				if(!a[0][len[0][i]])
					{
						a[0][len[0][i]] = i;
						c1[++c1[0]] = len[0][i];
					}
			}
	}


for(i = 1, c2[0] = 0; i < n; ++i)
	{
		for(j = 1; j < nr[i]; ++j)
			{
				for(k = 1; k <= c1[0]; ++k)
					{
						next = len[i][j] + c1[k];

						if(next < KMAX  &&  !a[i][next])
							{
								a[i][next] = j;
								c2[++c2[0]] = next;
							}
					}
			}
		memcpy(c1, c2, sizeof(c2));
		c2[0] = 0;

	}

}

void print_a()
{
int i, j;

for(i = 0; i < n; ++i)
	{
		for(j = 0; j <= k; ++j)
			printf("%d ", a[i][j]);
		printf("\n");
	}
printf("\n");
}


void print_len()
{
int i, j;

for(i = 0; i < n; ++i)
	{
		for(j = 1; j <= k; ++j)
			printf("%d ", len[i][j]);
		printf("\n");
	}
printf("\n");
}


void afisare(int i, int j)
{

if(i != -1)
	{
		afisare(i-1, j - len[i][ a[i][j] ]);

		conf[h++] = a[i][j];
	}

}

void write()
{
int i;

for(i = 0; i < h; ++i)
	{
		printf("%s ", p[i][conf[i]].c);
	}
printf("\n");
}


int main()
{
freopen("prop.in", "r", stdin);
freopen("prop.out", "w", stdout);

read();


dinamic();


//print_a();


//print_len();


if(a[n-1][k])
	{
		afisare(n-1, k);
		write();
	}
else
	printf("0\n");



fclose(stdin);
fclose(stdout);

return 0;
}