NC212879. 最长回文串
描述
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; }