uva 10132 - File Fragmentation

基本思路:先按照长度排序,总长度等于第一个子串加上最后一个子串,然后从最后开始枚举子串与子串file[0]相加,也从后开始找到另一个子串与子串file[1]相加,并交换相加顺序,直到两个先加的串相等。

注意考虑所有子串都相等的特殊情况。

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_LEN 256*8+5
#define MAX_LINE 300

char file[MAX_LINE][MAX_LEN];

int cmp(const void*a, const void*b) {
	return strlen((char*) a) - strlen((char*) b);
}

void judge(int n) {
	qsort(file, n, MAX_LEN * sizeof(char), cmp);
	int len = strlen(file[0]) + strlen(file[n - 1]);
	int i, j;
	char str1[len + 5];
	char str2[len + 5];
	for (i = n - 1; i > 0; i--) {
		strcpy(str1, file[0]);
		strcat(str1, file[i]);
		for (j = n - 1; j > 1; j--) {
			if (j == i)
				continue;
			strcpy(str2, file[1]);
			strcat(str2, file[j]);
			if (strcmp(str1, str2) == 0) {
				printf("%s\n", str1);
				return;
			}
		}
		for (j = n - 1; j > 1; j--) {
			if (j == i)
				continue;
			strcpy(str2, file[j]);
			strcat(str2, file[1]);
			if (strcmp(str1, str2) == 0) {
				printf("%s\n", str1);
				return;
			}
		}

	}
	for (i = n - 1; i > 0; i--) {
		strcpy(str1, file[i]);
		strcat(str1, file[0]);
		for (j = n - 1; j > 1; j--) {
			if (j == i)
				continue;
			strcpy(str2, file[1]);
			strcat(str2, file[j]);
			if (strcmp(str1, str2) == 0) {
				printf("%s\n", str1);
				return;
			}
		}
		for (j = n - 1; j > 1; j--) {
			if (j == i)
				continue;
			strcpy(str2, file[j]);
			strcat(str2, file[1]);
			if (strcmp(str1, str2) == 0) {
				printf("%s\n", str1);
				return;
			}
		}

	}
}

int main() {
	int cases;
	scanf("%d", &cases);
	getchar();
	getchar();
	while (cases--) {
		int i = 0;

		while (1) {
			gets(file[i]);
			if (file[i][0] == 0)
				break;
			i++;
		}

		judge(i);
		if (cases)
			printf("\n");

	}

	return 0;
}

 

你可能感兴趣的:(uva 10132 - File Fragmentation)