Codeforces 196 D. The Next Good String
2 seconds
256 megabytes
standard input
standard output
In problems on strings one often has to find a string with some particular properties. The problem authors were reluctant to waste time on thinking of a name for some string so they called it good.
A string is good if it doesn't have palindrome substrings longer than or equal to d.
You are given string s, consisting only of lowercase English letters. Find a good string t with
length |s|, consisting of lowercase English letters, which is lexicographically larger than s.
Of all such strings string t must be lexicographically minimum.
We will call a non-empty string s[a ... b] = sasa + 1... sb (1 ≤ a ≤ b ≤ |s|) a substring of
string s = s1s2... s|s|.
A non-empty string s = s1s2... sn is
called a palindrome if for all i from 1 to n the
following fulfills: si = sn - i + 1.
In other words, palindrome read the same in both directions.
String x = x1x2... x|x| is lexicographically
larger than string y = y1y2... y|y|,
if either |x| > |y| and x1 = y1, x2 = y2, ...
, x|y| = y|y|,
or there exists such number r (r < |x|, r < |y|),
that x1 = y1, x2 = y2, ...
, xr = yr and xr + 1 > yr + 1.
Characters in such strings are compared like their ASCII codes.
The first line contains integer d (1 ≤ d ≤ |s|).
The second line contains a non-empty string s, its length is no more than 4·105 characters.
The string consists of lowercase English letters.
Print the good string that lexicographically follows s, has the same length and consists of only lowercase English letters. If such string does not exist,
print "Impossible" (without the quotes).
3
aaaaaaa
aabbcaa
3
zzyzzzz
Impossible
4
abbabbbabbb
abbbcaaabab
搜索+hash。
长度为L的回文串一定包括长度为L-2的回文串。
推断回文的时候仅仅要推断d和d+1不是回文串就能够了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef unsigned long long int ull; const int maxn=500100; char s[maxn],r[maxn];
int n,d;
ull p[maxn],hash[maxn],rhash[maxn]; bool ok(int ed,int d)
{
ed++;
int st=ed-d+1;
if(st<0) return true;
if((rhash[ed]-rhash[st-1]*p[d])*p[st-1]!=hash[ed]-hash[st-1])
return true;
return false;
} bool dfs(int x,int t)
{
if(x==n)
{
puts(r);
return true;
}
for(r[x]=(t?s[x]:'a');r[x]<='z';r[x]++)
{
hash[x+1]=hash[x]+r[x]*p[x];
rhash[x+1]=rhash[x]*175+r[x];
if(ok(x,d)&&ok(x,d+1)&&dfs(x+1,t&&(r[x]==s[x])))
return true;
}
return false;
} int main()
{
scanf("%d %s",&d,s);
n=strlen(s);
int i=n-1;
for(;i>=0&&s[i]=='z';i--)
s[i]='a';
if(i<0)
{
puts("Impossible");
return 0;
}
s[i]++;p[0]=1;
for(int i=1;i<n+100;i++)
p[i]=p[i-1]*175;
if(dfs(0,1)==false)
puts("Impossible");
return 0;
}
Codeforces 196 D. The Next Good String的更多相关文章
- [Educational Codeforces Round 16]E. Generate a String
[Educational Codeforces Round 16]E. Generate a String 试题描述 zscoder wants to generate an input file f ...
- [Codeforces #196] Tutorial
Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...
- Codeforces Round #402 (Div. 2) D. String Game
D. String Game time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- Educational Codeforces Round 16 E. Generate a String dp
题目链接: http://codeforces.com/problemset/problem/710/E E. Generate a String time limit per test 2 seco ...
- CodeForces Round #527 (Div3) A. Uniform String
http://codeforces.com/contest/1092/problem/A You are given two integers nn and kk. Your task is to c ...
- Codeforces 196 E. Tricky and Cleve Password
\(>Codeforces \space 196\ E. Tricky\ and\ Cleve\ Password<\) 题目大意 : 给出一个有 \(n\) 个结点,\(m\) 条边的连 ...
- Educational Codeforces Round 9 C. The Smallest String Concatenation 排序
C. The Smallest String Concatenation 题目连接: http://www.codeforces.com/contest/632/problem/C Descripti ...
- Educational Codeforces Round 8 C. Bear and String Distance 贪心
C. Bear and String Distance 题目连接: http://www.codeforces.com/contest/628/problem/C Description Limak ...
- Educational Codeforces Round 9 C. The Smallest String Concatenation —— 贪心 + 字符串
题目链接:http://codeforces.com/problemset/problem/632/C C. The Smallest String Concatenation time limit ...
随机推荐
- Spark学习之RDD编程(2)
Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...
- IPython、Notebook、qtconsole使用教程
IPython.Notebook.qtconsole使用教程 上一篇为Python,IPython,qtconsole,Notebook,Jupyter快速安装教程 1. 使用IPython 自动补全 ...
- python的机器学习之路
2018-04-1712:22:40 这是python依靠计算机视觉进行的ocr手写字的识别. 通过KNN训练数据 kNN 可以说是最简单的监督学习分类器了.想法也很简单,就是找出测试数据在特征空间中 ...
- MySQL详解(18)-----------分页方法总结
---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...
- 【译】x86程序员手册22-6.4页级保护
6.4 Page-Level Protection 页级保护 Two kinds of protection are related to pages: 与页相关的保护有两类: Restriction ...
- Python+selenium学习(一) 打开Firefox浏览器,IE浏览器和Chrome浏览器
from selenium import webdriver # open Firefox #driver=webdriver.Firefox() # Open IE #driver=webdrive ...
- 第五届蓝桥杯校内选拔第七题_(树型dp)
G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军).现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死 ...
- 梦想CAD控件网页版线型
增加线型 主要用到函数说明: _DMxDrawX::AddLinetype 增加一个线型定义.详细说明如下: 参数 说明 BSTR pszName 线型名 BSTR pszLineDefine 线定义 ...
- Java基础(四)--接口和抽象类
接口和抽象类能够体现OOP的抽象,而接口和抽象类也是日常开发中经常用到的 抽象方法: 抽象方法就是被abstract修饰的方法,只有声明,没有实现,也就是没有方法体 public abstract v ...
- docker时区
docker cp /etc/localtime <id/name>:/etc/localtime