题目:

Codeforces1109B

我打的是 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(字符串)的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  3. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  4. JavaScript 字符串实用常操纪要

    JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...

  5. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  6. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

  7. ASP.NET加密和解密数据库连接字符串

    大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...

  8. Javascript正则对象方法与字符串正则方法总结

    正则对象 var reg = new Regexp('abc','gi') var reg = /abc/ig 正则方法 test方法(测试某个字符串是否匹配) var str = 'abc123'; ...

  9. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

随机推荐

  1. java 十六周总结

  2. Jet --theory

    (FIG. 6. A caricature of turbulent jet and the entrainment., Jimmy, 2012) Ref: Jimmy Philip, Phys. F ...

  3. wannafly-day1 Problem A - Birthday

    思路:队友贪心WA了,然后就没有然后了,自己也是第一次接触最小费用流的题.借这个题来学习一下,利用Spfa每次来找到一个最短的路径同时保存路径,每一次寻找最短路径就将这条路的最小费用流给剪掉,然后继续 ...

  4. dp专题备忘录

    hdu 1024:基础dp题 hdu 1029:主元素问题,很快的解法,计数器 hdu 1069:LIS hdu 1074:数位dp,数位dp基础 hdu 1257:简单LIS,要仔细分析为什么是求最 ...

  5. TCP/IP协议1

    1.分层 应用层 telent 远程登录,ftp 文件传输协议,smtp 简单邮件传送协议 snmp 简单网络管理协议 email 运输层  tcp(提供可靠的数据通信)和udp(数据报的分组从一台主 ...

  6. C. Painting Fence 分治

    memory limit per test 512 megabytes input standard input output standard output Bizon the Champion i ...

  7. Ubuntu 16.04通过Trickle限制某个软件的下载/上传速度

    在Linux下没有Windows使用360那样去限制某个软件的速度. 但是通过Trickle可以设置某个软件的网速,但是前提是通过Trickle命令连带启动这个软件才可以,不能中途去设置. 比如现在很 ...

  8. 非常适合新手的jq/zepto源码分析01

    (function(global, factory) { // 查看这里是不是定义成模块,如果定义模块就返回 一个模块 if (typeof define === 'function' &&a ...

  9. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

    Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...

  10. 一个MySQL-JDBC驱动bug引起的血案……

    问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是直接写入MySQL ...