UVA - 10132 File Fragmentation

题目大意:输入有点恶心,首先是case数,然后一个空行,然后再输入信息,然后又以一个空行结束该组数据,如果是最后一组数据了,不以空行结束,而是直接以EOF结束。输出,case之间有一个空行,最后一个case后面不要加空行

每组case的信息,就是N行的串,串中只有01,串的个数一定是偶数。原本有很多个一样的长串,每个长串都分成了两个短串但是分割的位置不一定相同即两个短串不一定是平分的(就是输入中的那些串)。你要把这偶数个短串拼回那个长串(即2N个短串拼回N个相同的长串),如果有多种可能,任意一种即可,然后输出这个长串

题目保证一定有有解的

解题思路:数据不大,144,直接暴力。首先按短串的长度升序排序,然后我们知道,长串的长度 = 最短的短串长度 + 最长的短串的长度。所以我们枚举最短的串和最长的串来组成一个长串,以这个长串也检验所有的组合,能成功的话立马输出

#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string A[300];
int n;

bool cmp(string a, string b) {
    return a.size() < b.size();
}

bool judge(string word) {
    int vis[300] = {0};
    for (int i = 0; i < n / 2; i++) {
        for (int j = n - 1; j >= n / 2; j--)
            if (!vis[j] && (A[i] + A[j] == word || A[j] + A[i] == word)) {
                vis[j] = vis[i] = 1;
                break;
            }
        if (!vis[i]) return false;
    }
    cout << word << endl;
    return true;
}

void solve() {
    for (int i = 0; A[i].size() == A[0].size(); i++)
        for (int j = n - 1; A[j].size() == A[n-1].size(); j--)
            if (judge(A[i] + A[j]) || judge(A[j] + A[i])) return;
}

int main() {
    int  T;
    scanf("%d\n", &T);
    char str[300];
    while (T--) {
        n = 0;
        while (gets(str) != NULL && str[0]) A[n++] = str;
        sort(A, A + n, cmp);

        solve();
        if (T) puts("");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-30 11:55:14

UVA - 10132 File Fragmentation的相关文章

File Fragmentation

很弱的数据,随便搞 #include <iostream> #include <cstdio> #include <map> #include <string> #include <cstring> #include <vector> #include <algorithm> using namespace std; void debug() { cout<<"yes"<<end

UVA File Fragmentation(文件复原)

Description Question 2: File Fragmentation The Problem Your friend, a biochemistry major, tripped while carrying a tray of computer files through the lab. All of the files fell to the ground and broke. Your friend picked up all the file fragments and

File Fragmentation Uva 10132

思路:最长的碎片和最短的碎片的组合中肯定有答案.所以先求长度,然后组合他们,最后检测组合结果字符串是否确保输入的碎片字符串都在其开始或结尾处. 总结:代码编写边注释,当你注释写不好的时候,说明你的思路也不是很清晰,请停下来思考,理清思路.下面这段代码是我注释得最详细的,因为我体会到,当自己写的程序不能AC的时候,搜搜看看别人没有注释的代码会更加让自己烦躁. #include<stdio.h> #include<string.h> void Reverse(char *strDest

Uva 12361 File Retrieval 后缀数组+并查集

题意:有F个单词,1 <= F <=60 , 长度<=10^4, 每次可以输入一个字符串,所有包含该字串的单词会形成一个集合. 问最多能形成多少个不同的集合.集合不能为空. 分析:用后缀数组处理.然后首先考虑一个单词形成一个集合的情况,若该单词是其他单词的字串,则该单词显然不会形成一个集合,那么利用后缀数组, 对于每个单词看能否与其他单词有LCP,且LCP 长度为该单词本身长度. 然后就是多个单词形成集合的情况:比较简单的处理方式就是将h数组值相同的下标集中存储,比如h[x] = h[y

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

UVA 10132-File Fragmentation(map还原字符串)

File Fragmentation The Problem Your friend, a biochemistry major, tripped while carrying a tray of computer files through the lab. All of the files fell to the ground and broke. Your friend picked up all the file fragments and called you to ask for h