sgu237:Galaxy X: Episode I - Masters of Mind(字符串DP)
2015-05-28 22:33
369 查看
题目大意:
~~~~~~给出一个字符串,包含有a−z,∗,!,?a-z,*,!,?这些字符(长度≤255\leq 255)。
~~~~~~∗*代表一个任意长度的字符串,可以为空串;
~~~~~~!!代表33个字符;
~~~~~~??代表11个字符;
~~~~~~求出长度最小且在该长度下字典序最小的回文串。
分析:
~~~~~~我们可以把!!变成33个??,方便处理。
~~~~~~然后分情况讨论字符串DPDP即可,详见代码。
AC code:
~~~~~~给出一个字符串,包含有a−z,∗,!,?a-z,*,!,?这些字符(长度≤255\leq 255)。
~~~~~~∗*代表一个任意长度的字符串,可以为空串;
~~~~~~!!代表33个字符;
~~~~~~??代表11个字符;
~~~~~~求出长度最小且在该长度下字典序最小的回文串。
分析:
~~~~~~我们可以把!!变成33个??,方便处理。
~~~~~~然后分情况讨论字符串DPDP即可,详见代码。
AC code:
[code]#include <cstdio> #include <string> #include <cstring> #include <iostream> #define ONLINE_JUDGE using namespace std; const int INPUT = 259; const int MAXN = INPUT*3; string NOANSWER = "FUCK"; char src[INPUT]; char str[MAXN]; int n; int f[3][MAXN]; string ans[3][MAXN]; int p = 0, q = 1, r = 2; void change(const string &s, int i) { f[r][i] = s.size(); ans[r][i] = s; } void update(const string &s, int i) { if(f[r][i] > (int)s.size() || (f[r][i]==(int)s.size()&&ans[r][i] > s)) change(s, i); } bool check(const string &s) { for(int i = 0, j = s.size()-1; i < j; ++i, --j) if(s[i] != s[j]) return false; return true; } int main() { #ifndef ONLINE_JUDGE freopen("sgu237.in", "r", stdin); freopen("sgu237.out", "w", stdout); #endif for(int i = 0 ; i < 10; ++i) NOANSWER += NOANSWER; scanf("%s", src); for(int i = 0, sz = strlen(src); i < sz; ++i) if(src[i] == '!') str[++n] = '?', str[++n] = '?', str[++n] = '?'; else str[++n] = src[i]; for(int i = 1; i <= n; ++i) { if(str[i] == '*') f[1][i] = 0; else f[1][i] = 1, ans[1][i] += (str[i]=='?'?'a':str[i]); } for(int i = 2; i <= n; ++i) { for(int j = 1; j+i-1 <= n; ++j) { char c1, c2; int k = j+i-1; c1 = str[j], c2 = str[k]; if(c1 == '*') { if(c2 == '*') { change(ans[p][j+1], j); update(ans[q][j], j); update(ans[q][j+1], j); } else { change(ans[q][j+1], j); if(c2 == '?') c2 = 'a'; update(c2+ans[q][j]+c2, j); } } else if(c2 == '*') { change(ans[q][j], j); if(c1 == '?') c1 = 'a'; update(c1+ans[q][j+1]+c1, j); } else { if(c1 == '?') { if(c2 == '?') change('a'+ans[p][j+1]+'a', j); else change(c2+ans[p][j+1]+c2, j); } else if(c2 == '?' || c1 == c2) change(c1+ans[p][j+1]+c1, j); else change(NOANSWER, j); } } int t = p; p = q, q = r, r = t; } if(check(ans[q][1])) { cout << "YES" << endl; cout << ans[q][1] << endl; } else cout << "NO" << endl; #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- 让UILabel的文字顶部对齐
- Oracle简介
- eclipse安装maven插件的步骤
- vs2010下配置pthread
- List::构造、复制构造、析构
- aidl ( 四) 各部分代码的执行进程和线程
- Android NDK开发指南---Application.mk文件和android.mk文件
- 数组的操作符重载
- Rake::TestTask 介绍
- 第二次冲刺(4)
- 智慧医疗项目启动前夜
- mysql外键指令总结
- 【HDU】5244 inverse【打表找规律——FFT】
- ice demo中关于#if compact #endif宏解释
- Java之旅--设计模式
- scala生成eclipse文件报:Cannot run program "javac": CreateProcess error=2,解决方法
- STL中map的用法
- JS学习指导
- 支持向量机简单实现
- 第三章第三十九题