uva10132 - File Fragmentation(文件碎片)

个人觉得这个题的输入模式不好,我开始的时候就没看懂,什么又是end of file又是case 的。压根就没搞懂怎么样子结束。

看了人家的读取语句,我照着写了下来。

思路: 就是按照字符串长度排序, 用最短的开始找与它长度可以满足lenth的字符串,然后判断即可。

我的判断程序可能写的耗时了,程序跑了12ms。我看一个大牛的代码经过不断优化最后跑了4ms。

其实这个题的数组很规范,所以我们可以小偷懒一下,没必要完全回复,完全验证。

我的代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
char st[200][300], aim[300];
int c, len;
int comp(const void *a,const void *b)
{
    char *c = (char*)a, *d = (char*)b;
    return strlen(c)-strlen(d);
}
int is_ok(char *A)
{
    int L, yes;
    for(int i = 0; i < c; i++)
    {
        yes = 1;    L = strlen(st[i]);
        for(int j = 0; j < L; j++) if(st[i][j]!=A[j]) { yes = 0; break;}
        if(yes) continue; else yes = 1;
        for(int j = 0; j < L; j++) if(st[i][L-1-j]!=A[len-1-j]) {yes = 0; break;}
        if(yes) continue; else return 0;
    }
    return 1;
}
int main ()
{
    int t;
    scanf("%d",&t);getchar(); getchar();
    while(t--)
    {
        c = 0;
        while(gets(st[c])&&st[c][0]!=0) c++;
        qsort(st,c,sizeof(st[0]),comp);
        len = strlen(st[0])+strlen(st[c-1]);
        for(int i = c-1;i >= 0; i--)
        if(strlen(st[i])==len-strlen(st[0]))
        {
            strcpy(aim,st[0]);  strcat(aim,st[i]);
            if(is_ok(aim)) {printf("%s\n",aim); break;}
            strcpy(aim,st[i]);  strcat(aim,st[0]);
            if(is_ok(aim)) {printf("%s\n",aim); break;}
        }
        if(t) printf("\n");
    }
    return 0;
}
再贴一下4ms的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char s[160][260],p[260],q[260];
int cmp(const void *a,const void *b)
{
	return strlen((char *)a)-strlen((char *)b);
}
int judge(int n,int len)
{
	int i,j,f;
	j=1;
	f=0;
	for(i=1;i<n;i++)
	{
		if(strlen(s[i])!=len-strlen(s[j])) continue;
		strcpy(q,s[j]);
		strcpy(q+strlen(s[j]),s[i]);
		if(strcmp(p,q)==0) return 1;
		strcpy(q,s[i]);
		strcpy(q+strlen(s[i]),s[j]);
		if(strcmp(p,q)==0) return 1;
	}
	return 0;
}
int main()
{
	int T,cnt,i,min,max;
	scanf("%d",&T);
	gets(s[0]); getchar();
	while(T--)
	{
		cnt=0;
		while(gets(s[cnt])&& s[cnt][0]!=0) 
			cnt++;
		qsort(s,cnt,sizeof(s[0]),cmp);
		min=strlen(s[0]);
		max=strlen(s[cnt-1]);
		for(i=cnt-1;i>=0 && strlen(s[i])==max;i--)
		{
			strcpy(p,s[0]);
			strcpy(p+strlen(s[0]),s[i]);
			if(judge(cnt,min+max)) break;
			strcpy(p,s[i]);
			strcpy(p+strlen(s[i]),s[0]);
			if(judge(cnt,min+max)) break;
		}
		printf("%s\n",p);
		if(T) printf("\n");
	}
	return 0;
}



你可能感兴趣的:(uva10132 - File Fragmentation(文件碎片))