Codeforces 1304B. Longest Palindrome
2024-09-07 00:57:56
根据数据范围,暴力可以解决,对每一个串,找与其互为回文的串,或者判断自身是否为回文串,然后两两将互为回文的串排列在头尾,中间放且只能最多放一个自身为回文串的串,因为题目说每个串都是不同的
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL; string str[];
int cache[], self[], s[], chosen[]; void run_case() {
int n, m;
cin >> n >> m;
for(int i = ; i <= n; ++i)
cin >> str[i];
for(int i = ; i <= n; ++i) {
bool flag = true;
for(int j = ; j < m/ && flag; ++j) {
if(str[i][j] != str[i][m-j-]) flag = false;
}
if(flag) {
self[i] = ;
continue;
}
if(cache[i]) continue;
string now = str[i];
reverse(now.begin(), now.end());
for(int j = ; j <= n; ++j) {
if(j != i && now == str[j]) {
cache[i] = j; break;
}
}
}
vector<int> ans, selfs;
int top = ;
for(int i = ; i <= n; ++i)
if(cache[i] && !chosen[i]) {
ans.push_back(i);
s[++top] = cache[i];
chosen[cache[i]] = i;
} else if(self[i]) selfs.push_back(i);
if(selfs.size()) ans.push_back(selfs[]);
while(top) {
ans.push_back(s[top--]);
}
cout << ans.size() * m << "\n";
for(auto i : ans)
cout << str[i];
} int main() {
ios::sync_with_stdio(false), cin.tie();
//cout.setf(ios_base::showpoint);cout.precision(10);
//int t; cin >> t;
//while(t--)
run_case();
cout.flush();
return ;
}
最新文章
- d3 中exit() remove()正确工作的方式
- 兼容解决 IE 、火狐、谷歌浏览器中 Iframe框架的页面缓存的方法
- Atitit &#160;图像处理底色变红的解决
- 修改镜像文件EI.CFG
- C#中Config文件中,特殊符号的书写方法。
- DelphiXE Android自适应屏幕办法
- jquery学习之旅
- 教你pomeloclient包libpomelo增加cocos2d-x 3.0工程(Windows、Android、IOS平台)
- 进程间通讯之mmap文件共享
- 201521123117 《Java程序设计》第9周学习总结
- vim 批量替换使用说明
- ruby学习--条件控制
- django之ReverseOneToOneDescriptor
- MongoDB学习笔记(11)-- Index
- Python——验证码识别 Pillow + tesseract-ocr
- VB将MSHFlexGrid数据导出到Excel文件通用功能
- android studio 更新 Gradle错误解决方法(Gradle sync failed)
- JUC——线程同步辅助工具类(Semaphore,CountDownLatch,CyclicBarrier)
- 【Linux】文件描述符与重定向
- POJ 3260 The Fewest Coins(多重背包问题, 找零问题, 二次DP)