【51NOD - 1523】 非回文(dfs)
题干:
一个字符串是非回文的,当且仅当,他只由前p个小写字母构成,而且他不包含长度大于等于2的回文子串。
给出长度为n的非回文串s。请找出字典序比s大的,而且字典序要最小的长度为n的非回文。
Input单组测试数据。
第一行有两个整数n 和p (1≤n≤1000; 1≤p≤26)。
第二行包含一个字符串s,它的长度是n。输入保证他是非回文的。Output输出字典序比s大的且字典序要最小的长度为n的非回文,如果不存在输出NO。Sample Input
样例输入1 3 3 cba 样例输入2 3 4 cba
Sample Output
样例输出1 NO 样例输出2 cbd
解题报告:
首先分析出非回文的标志语句,归纳推出是s[i] ! = s[i-1] && s[i] != s[i-2] ,然后用dfs搜索字典序增大的就可以了。
ac代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int len;
int n,p;
char s[1000+5],ss[1000+5];//s复制到ss,对s做修改
bool bk[1000+5];
bool ok() {if(s[0]==s[1]) return false;for(int i = 2; i<len; i++) {if(s[i]==s[i-1]||s[i]==s[i-2]) return false;}if(strcmp(ss,s)==0) return false;return true;
}
bool dfs(int step) {if(step>n) return false;if(step==n) {if(ok() ) {printf("%s\n",s);return true;}return false;}char i;bk[step]==1 ? i='a' : i = ss[step];bk[step]=1; for(; i<=96+p; i++) {if(step>=2) {if(i==s[step-1]||i==s[step-2]) continue; }else if(step==1) if(i==s[step-1]) continue;s[step]=i;//还是直接放在for下面也无所谓? if(dfs(step+1) ) return true;}return false;
}
int main()
{while(~scanf("%d%d",&n,&p)) {memset(s,0,sizeof(s));memset(ss,0,sizeof(ss));memset(bk,0,sizeof(bk));scanf("%s",s);strcpy(ss,s);len=strlen(s);if(!dfs(0) ) {printf("NO\n");}}return 0 ;
}
法2:(不用深搜)
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1005;char str[MAXN];int main() {int n, p;scanf("%d%d%s", &n, &p, str + 1);for (int i = n; i >= 1; i--) {int x = str[i] - 'a';if (x < p - 1) {int y = -1;for (int j = x + 1; j < p; j++) {char c = 'a' + j;if (i > 1 && c == str[i - 1]) continue;if (i > 2 && c == str[i - 2]) continue; y = j;break;}if (y == -1) continue;str[i] = 'a' + y;//printf("%d : %c\n", i, 'a' + y);if (i == n) {puts(str + 1);return 0;}for (int j = i + 1; j <= n; j++) {for (int k = 0; k < p; k++) {char c = 'a' + k;if (j > 1 && c == str[j - 1]) continue;if (j > 2 && c == str[j - 2]) continue; str[j] = c;break;}}puts(str + 1);return 0;}}puts("NO");return 0;
}
总结:注意字典序搜索的时候,不能都从 ss[step] 开始,需要有一个bk标记数组,因为第一次用完之后还需要从'a'开始,而不是ss[step]
【51NOD - 1523】 非回文(dfs)相关推荐
- Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开
6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数.编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开 题目 题目描述 破题 代码 题目 题目描述 ...
- Libre OJ 「BalticOI 2013」非回文数 数位dp
传送门 文章目录 题意: 思路: 题意: 问[l,r][l,r][l,r]内有多少个数是非回文数,即数字中不存在连续几个数为回文数. l,r≤1e18l,r\le1e18l,r≤1e18 思路: 这么 ...
- 【51nod 1154】 回文串划分
有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. a|bb|aabaa - 3 个回文串 a|bb|a|aba|a - 5 个回文串 a|b|b|a|a|b ...
- 回文数的JAVA程序
2019独角兽企业重金招聘Python工程师标准>>> 这是包括字符的回文数 import java.util.Scanner; import javax.swing.JOption ...
- 【简便解法】1079 延迟的回文数 (20分)_31行代码AC
立志用更少的代码做更高效的表达 PAT乙级最优解+分析汇总-->传送门 给定一个 k+1 位的正整数 N,写成 ak-a1a0的形式,其中对所有 i 有 0≤ai<10 且 ak ...
- 1079. 延迟的回文数 (20)
给定一个 k+1 位的正整数 N,写成 ak...a1a0 的形式,其中对所有 i 有 0 <= ai < 10 且 ak > 0.N 被称为一个回文数,当且仅当对所有 i 有 ai ...
- LeetCode 267. 回文排列 II(回溯)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s ,返回其通过重新排列组合后所有可能的回文字符串,并去除重复的组合. 如不能形成任何回文排列时,则返回一个空列表. 示例 1: 输入: ...
- 算法-两最长回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1:输入: "babad" 输出: "bab" 注意: &q ...
- 1112个人赛,最长回文串常见算法讨论
ps.此贴大部分文字与代码来自网上,我只是取长补短整理了下 S="c a b a" 那么 S' = "a b a c", 这样的情况下 S和 S'的最长公共 ...
最新文章
- Qt中如何改变三角形图形项的包围盒
- Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
- java之Scanner
- 开源WebGIS实施方案(一):开篇 [转]
- PostgreSQL 创建库时如何指定 Collate, Ctype
- 河南大学明德计划2020计算机学院,关于选拔2020级物理学“明德计划”实验班学生的通知...
- 无法获取未定义或 null 引用的属性“value”_SpringBoot之Spring@Value属性注入使用详解
- 信息学奥赛C++语言: 计算两个数的最小公倍数
- linux 卷标设置与管理
- VRTK之手柄事件监听以及重写StartUsing方法实现与物体的交互
- ajax请求会阻塞dom,Jquery ajax 同步阻塞引起的UI线程阻塞问题_jquery
- c++11 多线程编程(二)------ 线程类构造函数深入理解
- Linux 命令之 tar 备份与解压缩
- VisualSVN Server提交整个工程项目
- 计算机语言t和o,PLC编程语言/操作指令/使用步骤详解
- 如何下载微信公众号的音频文件
- oracle rman表空间传输,rman 实现在线传输表空间(=10g)
- 安装MikTex并成功编译中文PPT模板详细过程
- Java字符串:getBytes() 方法
- jquery 延迟执行
热门文章
- [Leetcode][第98 450 700 701题][JAVA][二叉搜索树的合法性、增、删、查][递归][深度遍历]
- [小技巧][JAVA][转换]整型int与字符串String相互转换
- [剑指offer]面试题第[6]题[JAVA][旋转数组的最小数字][二分法]
- 求递归算法时间复杂度:递归树
- 计算机信息管理相关课题论文,计算机信息管理课题论文[].doc
- excel亮灯怎么设置_Excel表格技巧—怎么给表格设置密码
- WEBSHELL权限提升 菜菜
- python发钉钉消息_Python调用钉钉机器人推送消息
- java版本streamgobbler_java调用本地命令 Runtime class's exec() method
- export LD_LIBRARY_PATH 的使用