【Codeforces1109B_CF1109B】Sasha and One More Name(字符串)
题目:
我打的是 Div2 ,所以我看到的题号实际上是 1113D ……
考场上傻了没敢大力猜结论没做出来这道题,不幸掉分…… 1869->1849 嘤嘤嘤
翻译:
读书是萨沙的爱好之一。有一次,他读书时了解到一个不同寻常的角色。这个角色这样介绍自己:“我在不同的地方有不同的名字。在精灵中叫米斯兰迪尔;在小矮人中叫塔空;在被遗忘的西方,幼年的我叫欧络因;在南方叫因卡诺斯;在北方叫甘道夫;至于东方,我没有去过。”
那时,萨沙想,这个角色在东方被怎样称呼?在东方,所有的名字都是回文串。如果一个字符串从前向后读和从后向前读是完全相同的,那么它是一个回文串。例如,像 "kazak", "oo" 和 "r" 这样的字符串是回文串,而 "abb" 和 "ij" 不是。
萨沙相信这个英雄将因东方的一个神而得名。为了避免有两个相同的名字,东方人会做如下的事:他们把原本的名字写在一张纸上,然后把纸剪 \(k\) 次,得到 \(k+1\) 张写有原串的子串的纸。接着,把这些纸拼在一起得到一个新字符串。纸不能翻转,只能打乱。
通过这种方式,可以把字符串 f|de|abc|g 剪 \(3\) 次后得到 abcdefg (交换 f 和 abc )。以相同的裁剪方式无法得到字符串 cbadefg 。
更形式化地,萨沙想为给定的字符串 \(s\) 找一个最小的 \(k\) ,你可以把它剪成 \(k+1\) 个部分,再把它们拼成一个与 \(s\) 不同的新回文串。如果无解,输出 "Impossible"(不含引号)。
输入
第一行包含一个字符串 \(s(1\leq |s| \leq 5000)\) ——初始的名字,只包含小写拉丁字母。保证 \(s\) 是回文串。
输出
输出一个整数 \(k\) ——获得新名字所需裁剪次数的最小值,或 "Impossible"(不含引号)。
分析:
论大胆猜结论的重要性……
结论:无解的充要条件是 \(s\) 中对称轴任意一侧的所有字母均相同。如果有解,则解不超过 \(2\) 。
证明:
先看前半句。充分性显然(长度为偶数相当于所有字母都一样;长度为奇数相当于除了对称轴所有字母都一样,此时对称轴字母是唯一的肯定不能动。剩下所有字母都相同怎么排都是一样的啊qwq)。必要性考虑构造。如果有解,则一定存在一个长度不超过一半的前缀 \(pre\) 满足 \(pre\) 不是回文串。设与 \(pre\) 长度一致的后缀为 \(suf\) ,则在 \(pre\) 后和 \(suf\) 前各剪一刀,然后交换 \(pre\) 和 \(suf\) ,则一定是一个与原串不同的新回文串。因此一定有解,且解不超过 \(2\) 。
于是暴力 \(O(n^2)\) 判断一下能不能只剪一刀,也就是把一个前缀挪到后面得到合法的字符串即可。
代码:
#include <string>
#include <iostream>
using namespace std;
namespace zyt
{
string s;
bool check(const string s)
{
for (int i = 0; i < (s.size() >> 1); i++)
if (s[i] != s[0])
return true;
return false;
}
bool is_palindrome(const string s)
{
for (int i = 0; i < (s.size() >> 1); i++)
if (s[i] != s[s.size() - i - 1])
return false;
return true;
}
bool solve(const string s)
{
string t = s;
for (int i = 0; i < (s.size() >> 1); i++)
{
t = t.substr(1) + s[i];
if (t != s && is_palindrome(t))
return true;
}
return false;
}
int work()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> s;
if (!check(s))
cout << "Impossible";
else if (solve(s))
cout << 1;
else
cout << 2;
return 0;
}
}
int main()
{
return zyt::work();
}
【Codeforces1109B_CF1109B】Sasha and One More Name(字符串)的更多相关文章
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- JavaScript 字符串实用常操纪要
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...
- Javascript正则对象方法与字符串正则方法总结
正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
随机推荐
- idea14远程调试linux下的tomcat
进入到idea的tomcat的run/debug配置,新建个remote tomcat,然后填写相关信息,如上图(注意远程调试端口). 再选择Startup/Connection,如下图所示: 到此, ...
- [bzoj1569][JSOI2008][Blue Mary的职员分配]
Description 由于Blue Mary呕心沥血的管理,Blue Mary的网络公司蒸蒸日上.现在一共拥有了n名职员,可惜没有任何的金钱和声誉.平均每名每天职员都可以给公司带来x单位金钱或者y单 ...
- yarn & vue-cli
yarn & vue-cli https://github.com/xgqfrms/ES6/issues/10 install https://yarnpkg.com/zh-Hans/docs ...
- [luoguP1196] 银河英雄传说(并查集)
传送门 记录 up[x] 表示 x 上方有多少个 all[x] 表示当前连通的有多少个 find 的时候 和 合并的时候 更新一下即可 ——代码 #include <cstdio> #in ...
- hdu 2546 0-1背包
#include<stdio.h> #include<string.h> #define N 1100 int dp[N],a[N]; int main() { int n,m ...
- hdu——3836 Equivalent Sets
Equivalent Sets Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Other ...
- Linux配置hugepage
对于内存较大的Oracle数据库server,配置HugePage是非常有必要的,以下是配置Huge的步骤: 我的环境: OS:CentOS release 6.4 (Final) Oracle:11 ...
- C#之插入排序
算法描述 1.假定数组第一位为有序序列,抽出后一位元素与有序序列中元素依次比较: 2.如果有序序列元素大于抽出元素,将该元素向后移位: 3.重复前面步骤依次抽取无序序列中首位元素进行比较,直到所有数值 ...
- 四:Java之字符串操作String、StringBuffer和StringBuilder
string是我们经经常使用到的一个类型,事实上有时候认为敲代码就是在重复的操作字符串,这是C的特点,在java中.jdk非常好的封装了关于字符串的操作.三个类String .StringBuffer ...
- SQL语句多表连接查询语法
一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on student.Num= ...