[BZOJ3395]回文串
来源:互联网 发布:centos 7 1611下载 编辑:程序博客网 时间:2024/05/20 14:20
问题描述有n(1≤n≤4)种字母,第种字母有ai(1≤ai≤10^9)个,你可以任意排列这些字母的顺序来组成一个字符串。你的任务是判断是否存在一种排列方式使得字符串中本质不同的回文子串的个数为n。输入格式每个输入文件包含多组数据。输入文件的第一行只有一个正整数T(1≤T≤10),表示数据的组数。接下来依次输入T组数据。每组数据的第一行,包含一个正整数n。每组数据的第二行,包含n个正整数a1,a2, ··· ,an。输出格式对于每组输入数据依次输出一行答案,若存在输出YES,若不存在输出NO。样例输入142 2 5 5样例输出YES样例解释令s(l,r)表示字符串中下标从l到r的连续的一段,若∃l,r ,s ,s(l,r) = t,则称t是s的子串。令rev(s)表示字符串s的倒序,若s = rev(s),则称s是回文串。若s ≠ t,则称s,t本质不同。记这四种字母分别为a,b,c,d,字符串cdacdbcdacdbcd 的本质不同的回文子串共4个,分别是a,b,c,d,所以存在。
来源 by Quack题解:由题意可推得,当字符串中只有长度为1的回文子串(即单个字母)时,条件才成立。知道这个条件,题就很好做了,直接分类讨论。
当n=1时,只有1种字母,其数量只能为1;
当n=2时,有2种字母,其数量只能各为1;
当n=3时,有3种字母,最多数量的字母和最少的之差不能超过1;
当n=4时,有4种字母。因为2个相同字母中间至少有2个不同的字母将其隔开(如abca),所以按数量排序,每次选大的三个,同时减去其中最小数的值,反复操作(其实也就2次)直到不为0的数≤2个,看其值是否≤1。
#include<cstdio>#include<algorithm>using namespace std;int T, n, A[5];int main() {for( scanf( "%d", &T ); T; T-- ) {scanf( "%d", &n ); for( int i=0; i<n; i++ ) scanf( "%d", &A[i] );if( n==1 ) A[0]==1 ? printf( "YES\n" ) : printf( "NO\n" );if( n==2 ) A[0]+A[1]==2 ? printf( "YES\n" ) : printf( "NO\n" );if( n==3 ) sort( A, A+n ), A[2]-A[0]<=1 ? printf( "YES\n" ) : printf( "NO\n" );if( n==4 ) {for( int i=0; i++<2; ) sort( A, A+n ), A[3]-=A[1], A[2]-=A[1], A[1]=0;A[2]<=1 && A[3]<=1 ? printf( "YES\n" ) : printf( "NO\n" );}}return 0;}
阅读全文
0 0
- [BZOJ3395]回文串
- 回文数&&回文串
- 回文串
- 回文串
- 回文串
- 回文串
- 回文串
- 回文串
- 回文串
- 回文串
- 回文串
- 回文串
- 回文串
- **回文串
- 回文串
- 回文串
- 回文串
- 回文串
- HDU 5832A water problem 简单模拟
- listagg函数将查询列转为行
- 类文件结构
- POJ-2528Mayor's posters(离散+线段树区间覆盖)
- URL(字符串)
- [BZOJ3395]回文串
- leetcode--84. Largest Rectangle in Histogram
- 安装samba
- MATLAB中文件的读写和数据的导入导出【转】
- 十二章 汇总数据
- 学奥数对孩子究竟有哪些好处?
- 小于等于n的素数的个数(埃式筛选法和欧拉筛选)
- Java中MD5计算摘要
- git merge和git rebase的区别(转)