5 a?bb? 3 aaa
aabba QwQ
1001 Rikka with string 如果没有不是回文串的限制可以把所有的?都变成a,这样一定是字典序最小的。而现在有了回文串的限制,我们可以从小到大枚举最靠后的不在字符串正中心的问号选什么,其他的问号依然换成a,显然如果有解,这样一定可以得到字典序最小的解。注意特判没有问号以及问号在正中心的情况。 时间复杂度O(n) Hack点:pretest挺强的也没有什么能hack的了吧
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char str[1005]; int len; int flag; int judge() //判断是否是回文数! { for(int i = 0; i <= len / 2; i++) { if(str[i] != str[len - i - 1]) return 1; } return 0; } void dfs(int x) //DFS! { if(flag == 0) return; //flag=0,即递归出口已到 if(x == len) { if(judge())<span style="white-space:pre"> </span> //如果不为回文数! { printf("%s\n", str); flag = 0; } return; } if(str[x] <= 'z' && str[x] >= 'a') //不是'?'往下一位搜索 { dfs(x + 1); return; } if(str[x] == '?') { for(int i = 'a'; i <= 'z'; i++) //如果是'?'则按照字典序来全部替换 { str[x] = (char)i; dfs(x + 1); //替换之后继续往下一位深搜 str[x] = '?'; <span style="white-space:pre"> </span> //因为每一次只判断一个问号,所以深搜完后要还原! } } } int main() { int n; while(scanf("%d", &n) != EOF) { scanf("%s", str); len = strlen(str); flag = 1; dfs(0); if(flag) { printf("QwQ\n"); } } return 0; }
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:
有一天勇太得到了一个长度为n 的字符串,但是六花一不小心把这个字符串搞丢了。于是他们想要复原这一个字符串。勇太记得这个字符串只包含小写字母而且这个串不是回文串。然而不幸的是他已经不记得这个字符串中的一些字符了,你可以帮他复原这个字符串吗?
当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
多组数据,数据组数不超过20 ,每组数据第一行两个正整数n 。接下来一行一个长度为n 的只包含小写字母和’?’的字符串,’?’表示勇太已经忘了这一个位置的字符了。1≤n≤103
每组数据输出仅一行一个长度为n的仅包含小写字母的字符串,如果有多种合法解,请输出字典序最小的,如果无解,请输出”QwQ”
5 a?bb? 3 aaa
aabba QwQ
HDU-5202-Rikka with string(DFS + WrongAnswer)
原文地址:http://blog.csdn.net/qq_16542775/article/details/45365881