博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 1178E Archaeology (鸽巢原理)
阅读量:5228 次
发布时间:2019-06-14

本文共 1503 字,大约阅读时间需要 5 分钟。

题意:

给你1e6的字符串,保证只含'a''b''c'三种字符,且相邻两个字符一定不一样

求一个大于等于n/2的回文子序列

思路:

朴素的最长回文子序列是n方的区间dp,这题显然不行,要充分利用题中所给的条件

我们发现,在任意不相交的两个区间[l,l+1]与[r,r+1]中

有两组相邻的字母,一共四个字母,而题目保证了每组两个相邻的字母肯定不同,

所以这四个字母中最多有3种字母,又因为每组字母不相同,所以这两个区间中一定有一个相同的字母

这题就搞完了

代码:

#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fst first#define sc second#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))#define lson l,mid,root<<1#define rson mid+1,r,root<<1|1#define lc root<<1#define rc root<<1|1using namespace std;typedef double db;typedef long double ldb;typedef long long ll;typedef unsigned long long ull;typedef pair
PI;typedef pair
PLL;const db eps = 1e-6;const int mod = 998244353;const int maxn = 2e6+100;const int maxm = 2e6+100;const int inf = 0x3f3f3f3f;//const db pi = acos(-1.0);int n;char a[maxn];int vis[maxn];int main(){ scanf("%s",a+1); n=strlen(a+1); int l=1,r=n; int ans = 0; while(l<=r){ //printf("%d %d\n",l,r); if(l==r){vis[l]=1;break;} if(l+1==r){vis[l]=1;break;} if(l+2==r){vis[l]=1;break;} if(a[l]==a[r]){vis[l]=vis[r]=1;} else if(a[l]==a[r-1]){vis[l]=vis[r-1]=1;} else if(a[l+1]==a[r-1]){vis[l+1]=vis[r-1]=1;} else if(a[l+1]==a[r]){vis[l+1]=vis[r]=1;} l+=2;r-=2; } for(int i = 1; i <= n; i++){ if(vis[i])printf("%c",a[i]); } return 0;}/*abcbabcbcbabaababcbabacbacb */

 

转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/11221398.html

你可能感兴趣的文章
Java程序设计教程(第2版)阅读总结
查看>>
vscode + platformIO开发stm32f4
查看>>
图论-次短路求法
查看>>
ios下opencv编译merge函数报错问题
查看>>
POJ 1679 The Unique MST(最小生成树)
查看>>
WebView网络请求
查看>>
[BZOJ 4836] 二元运算
查看>>
Internetmap.apk实现原理分析
查看>>
活跃事项传送门(2017年8月)
查看>>
JavaScript设计模式-1.函数
查看>>
textbox不支持Ctrl+A
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
1001. 害死人不偿命的(3n+1)猜想 (15)
查看>>
点至直线的距离和垂足点计算
查看>>
getopt_long
查看>>
Docker探索系列2之镜像打包与DockerFile
查看>>
HTML5中File
查看>>
如何在ashx页面获取Session值
查看>>