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 ...
随机推荐
- git add . 的时候报错fatal: Unable to create : …File exists.
报错内容: $ git add . fatal: Unable to create 'E:/project/qbm_cs/.git/index.lock': File exists. Another ...
- 生产环境4.3.5jboss内存调优
1.查看jboss的监控工具 http://XXX/jmx-console/htmladaptor 2.查看jvm的监控工具 jdk\bin jvisualvm.exe jmc.exe 3.查看jbo ...
- java byte
项目中有段代码,一直让我疑惑不解,但我是个很会偷懒的人,只要拷贝来改改能用的代码,万万不会自己动手写,虽然一直有疑惑,也懒得搭理是怎么个原理. 直到今天,又要解析协议,又要动这个地方的代码,还是来盘他 ...
- PHP 优秀资源汇集(照搬)
文章目录 原文地址: https://shockerli.net/post/php-awesome/ GitHub: https://github.com/shockerli/php-awesome ...
- A6. JVM 垃圾回收算法(GC 算法)
[概述] 常见的垃圾回收算法有:标记-清除算法.复制算法.标记-整理算法.分代收集算法. [标记-清除算法] 标记-清除算法是最基础的收集算法,如同它的名字一样,算法分为 “标记” 和 “清除” 两个 ...
- JAVA基础——is-a 、have-a、和 like-a的区别
1.is-a,has-a,like-a是什么 在面向对象设计的领域里,有若干种设计思路,主要有如下三种: is-a.has-a.like-a java中在类.接口.抽象类中有很多体现. 了解java看 ...
- css 实现垂直居中
通用 代码: 1 2 3 4 <div id="parent"> <div id="floater"></div> < ...
- Re0:DP学习之路 饭卡 HDU - 2546
解法 01背包变式,首先贪心的想一下如果要保证余额最小那么就需要用相减后最小的钱减去之前最大的价格,且得保证这个钱在5元以上 对于寻找如何减最多能包含在5元以上,这里用01背包 我们把价钱看做体积装进 ...
- 大数低速幂运算模板(c++)+python大数幂
简介 自己从大数加法改过来的模板,低速计算n的t次幂,n,t小于等于100速度能够保证 模板 #include <bits/stdc++.h> using namespace std; s ...
- 集合:ListIterator
why ? when ? how ? what ? Java 集合框架图 有了 Iterator 为什么还要有 ListIterator 呢? Iterator 遍历的时候如果你想修改集合中的元素怎么 ...