uva 10132 File Fragmentation

来源:互联网 发布:whatsapp数据迁移 编辑:程序博客网 时间:2024/06/05 15:23

简单题目,map的综合应用,最长的串和最短的串的一个组合必定是最后的结果,枚举所有可能的组合出来的字符串就行了,注意短的串在前面和长的串在前面的情景都要进行枚举,一开始就是只枚举了一种才一直wa.

#include <stdio.h>#include <string>#include <string.h>#include <vector>#include <map>using namespace std;char buf[1000];struct node{string str;};bool operator < (const struct node &a, const struct node &b){return a.str < b.str;}map<struct node, int> m_g;bool is_suitable(string str){map<struct node, int> m;map<struct node, int>::iterator it;struct node no;string s1, s2;m = m_g;it = m.begin();while(1){s1 = (it->first).str;s2 = str.substr(s1.length());no.str = s2;if(m.find(no) == m.end()){it++;if(it == m.end())break;elsecontinue;}else{if(it->second >= 2)it->second = it->second -1;elsem.erase(it);if((it=m.find(no)) == m.end())break;if(it->second >= 2)it->second = it->second -1;elsem.erase(it);if(m.empty())break;it = m.begin();}}if(m.empty())return true;return false;}void func(int min_len, int max_len){string s1, s2, sum_string;vector<string> v1, v2;map<struct node, int>::iterator it;int i, j;v1.clear();v2.clear();for(it=m_g.begin(); it!=m_g.end(); it++){if((it->first).str.length() == min_len)v1.push_back((it->first).str);if((it->first).str.length() == max_len)v2.push_back((it->first).str);}for(i=0; i<v1.size(); i++){for(j=0; j<v2.size(); j++){sum_string = v1[i] + v2[j];if(is_suitable(sum_string))goto end;sum_string = v2[j] + v1[i];if(is_suitable(sum_string))goto end;}}end:printf("%s\n", sum_string.c_str());}int main(void){int n, i;char *res;int min_len, max_len, len;//freopen("input.dat", "r", stdin);gets(buf);sscanf(buf, "%d", &n);gets(buf);struct node no;for(i=1; i<=n; i++){if(i >= 2)printf("\n");m_g.clear();min_len = 99999;max_len = -1;while(1){res = gets(buf);//printf("buf=%s,len=%d\n", buf, strlen(buf));if(res == NULL){func(min_len, max_len);break;}if(!strcmp(buf, "")){func(min_len, max_len);break;}len = strlen(buf);if(len > max_len)max_len = len;if(len < min_len)min_len = len;no.str.assign(buf, len);if(m_g.find(no) == m_g.end())m_g[no] = 1;elsem_g[no] = m_g[no]+1;}}return 0;}