CF1304B Longest Palindrome

B. Longest Palindrome

原题

Problem Restatement

给出n个,长度为m的字符串。$(1≤𝑛≤100,1≤m≤50) $

用部分或全部字符串,在一定的顺序拼接下,拼出最长的回文串。

Solution

数据小,直接配对即可。

对于每个串寻找是否存在其共轭串(即一正一反),若存在则放置在串两头。

否则,看是否该串本就是回文,若是则放置中间。

Code

#include <bits/stdc++.h>
using namespace std;

int n,m;

bool ispair(char *s1,char *s2){
	for(int i=0;i<m;i++){
		if(s1[i]!=s2[m-i-1]) return 0;
	}
	return 1;
}

bool ispalindrome(char *s1){
	for(int i=0;i<m;i++){
		if(s1[i]!=s1[m-i-1]) return 0;
	}
	return 1;
}

char s[105][105];
bool flag[105];
list<int> li;

void solve(){
	scanf("%d %d", &n, &m);
	for(int i=1;i<=n;i++)
		scanf("%s", s[i]);
	memset(flag+1,0,n*sizeof(flag[0]));
	li.clear();
	int mid=0;
	for(int i=1;i<=n;i++){
		if(flag[i]) continue;
		for(int j=i+1;j<=n;j++){
			if(flag[j]) continue;
			if(ispair(s[i],s[j])){
				flag[i]=flag[j]=1;
				li.push_front(i);
				li.push_back(j);
				break;
			}
		}
		if(!flag[i] && !mid){
			if(ispalindrome(s[i])) mid=i;
		}
	}
	if(mid) printf("%lu\n", m*li.size()+m);
	else printf("%lu\n", m*li.size());
	if(li.size()==0 && mid){
		printf("%s\n", s[mid]);
	}
	else{
		int cnt=0;
		for(auto t:li){
			cnt++;
			printf("%s", s[t]);
			if(cnt==li.size()/2) printf("%s", s[mid]);
		}
	}
}

int main(){
	int T=1;
	// scanf("%d", &T);
	while(T--){
		solve();
	}
	return 0;
}
posted @ 2020-02-25 01:38  Leachim  阅读(151)  评论(0编辑  收藏  举报