您的位置:首页 > 其它

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:

[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;   
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: