列表

详情


NC212879. 最长回文串

描述


回文串是反转后与自身完全相同的字符串
比如:"ABA","ACMMCA","A"。
给出一系列长度相同的字符串,请按序进行如下操作构造出最长的回文串:

1.舍弃一些字符串
2.重新排列剩余的每个字符串内字符的顺序,重新排列后的结果可以与原字符串相同
3.重新排列剩余字符串的顺序
4.将剩余字符串按序首尾连接组成回文串

输入描述

第一行输入两个整数 n 和 m ,表示字符串的数量和每个字符串的长度。
接下来 n 行每行包含一个长度为m的字符串,每个字符串由小写英文字母组成。

输出描述

每组数据输出一个整数,表示经过以上四次操作你能够得到的最长回文串的长度。

示例1

输入:

3 3  
tab
one
abt

输出:

6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 524K, 提交时间: 2022-08-17 10:23:45

#include<bits/stdc++.h>

using namespace std;

int n , m , res , f;
map< string , int > st;

int32_t main() {
    cin >> n >> m;
    for( string s ; n ; n -- ){
        cin >> s;
        sort( s.begin() , s.end() );
        st[s]++;
    }
    for( auto [k,v] : st ){
        res += v - (v&1);
        if( v&1 && !f ){
            array < int , 26 > t{};
            for( auto it : k ) t[it-'a'] ++;
            int cnt = 0;
            for( auto it : t )
                cnt += it & 1;
            if( cnt <= 1 ) f = 1;
        }
    }
    cout << ( res + f ) * m << "\n";

    return 0;
}

C++(clang++11) 解法, 执行用时: 2ms, 内存消耗: 376K, 提交时间: 2020-10-29 21:54:39

#include <bits/stdc++.h>
using namespace std;
int n, m;
map<array<int, 26>, int> cnt;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;
	for(int i=1; i<=n; i++)
	{
		string s; cin >> s;
		array<int, 26> cur = {};
		for(int j=0; j<m; j++) cur[s[j]-'a']++;
		cnt[cur]++;
	}
	int ans = 0, ext = 0;
	for(auto &it : cnt) ans += it.second/2*2*m;
	for(auto &it : cnt)
	{
		if(it.second&1)
		{
			int odd = 0;
			for(int i=0; i<26; i++) 
				if(it.first[i]&1) ++odd;
			if(odd<=1) ext = m;
		}
	}
	cout << ans + ext << '\n';
	return 0;
}

上一题