给出一个串不同断点位置分成的不同两段组的组,求原串。
思路:
暴力求解,先求出最短串的长和最长串的长相加作为原串的长,然后将所有满足这个串长得字符串各自前后的组合方式都组合一遍,最多组合方式对应的串就是原串啦
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 1005;
int n ,l, k;
struct node {
char str[maxn];
int len;
}s[maxn];
char a[maxn][maxn];
bool cmp(node a, node b) {
return a.len<b.len;
}
int cmp2(const void*_a, const void*_b) {
return strcmp((char*)_a, (char*)_b);
}
void input() {
int i=0;
while(gets(s[i].str)) {
if(!s[i].str[0]) break;
s[i].len = strlen(s[i].str);
i++;
}
n = i;
}
void deal() {
int i, j;
k=0;
memset(a, 0, sizeof(a));
for(i=0; i<n; i++)
for(j=i+1; j<n; j++) {
if(s[i].len+s[j].len==l) {
strcat(a[k], s[i].str);
strcat(a[k++], s[j].str);
strcat(a[k], s[j].str);
strcat(a[k++], s[i].str);
}
}
}
int main() {
int kase;
int i;
scanf("%d", &kase);
getchar();
getchar();
while(kase--) {
input();
sort(s, s+n, cmp);
l = s[0].len+s[n-1].len;
deal();
int count=1, mcount=0;
qsort(a, k, sizeof(a[0]), cmp2);
int flag;
for(i=0; i<k-1; i++) {
if(strcmp(a[i],a[i+1]) == 0) count++;
else {
if(mcount<count) {
flag = i;
mcount=count;
}
count = 1;
}
}
if(mcount > count) printf("%s\n", a[flag]);
else printf("%s\n", a[k-1]);
if(kase) printf("\n");
}
return 0;
}