Lesicographically最小的回文

时间:2016-09-11 05:37:19

标签: c++ palindrome

字符串中的褪色字符用'。'表示。其他字符是小写拉丁字母,即['a' - 'z']。可以包含一个或多个褪色字符串。我希望通过用小写拉丁字母填充每个褪色字符('。')来构造字典上最小的回文。我正在尝试3个小时,但我得到了错误的判决。我无法解决我的问题。任何人都可以帮助我吗?

这是我的代码:

    #include<bits/stdc++.h>
using namespace std;
#define uniq(x)  x.erase(unique(x.begin(),x.end()), x.end()) //Unique value find from vector
#define upper(arr,n,fixed) upper_bound(arr,arr+n,fixed)-arr  //Upper value search;
#define lower(arr,n,fixed) upper_bound(arr,arr+n,fixed)-arr  //Lower value search;
#define max3(a,b,c) max(max(a,b),c)//maximum value find three value;
#define min3(a,b,c) min(min(a,b),c)//minimum value find three value;
#define PI acos(-1.0)//PI Calculation
#define LL long long
#define AND(a,b) ((a) & (b))
#define OR(a,b) ((a)|(b))
#define XOR(a,b) ((a) ^ (b))
#define mp make_pair
#define sqr(x) ((x)*(x))
#define sqrt(x) sqrt(1.0*(x))
#define INF_MAX 2147483647
#define INF_MIN -2147483647
#define MX 1000005
#define MOD 1000000007
template<typename T> T POW(T b,T p)          //Pow calculation
{
    T r=1;
    while(p)
    {
        if(p&1)r=(r*b);
        b=(b*b);
        p>>=1;
    }
    return r;
}

template<typename T> T BigMod(T b,T p,T m) //BigMod Calculation
{
    T r=1;
    while(p)
    {
        if(p&1)r=(r*b)%m;
        b=(b*b)%m;
        p>>=1;
    }
    return r;
}

//||--------------------------->||Main_Code_Start_Here||<---------------------------------||
int main()
{
    //freopen("a.in", "r", stdin);
    //freopen("a.out", "w", stdout);
    int test;
    string s;
    cin>>test;
    while(test--)
    {
        cin>>s;
        for(int i=0; i<s.size()/2; i++)
        {
            if(s[i]=='.')
            {
                if(s[i]==s[s.size()-1-i])
                {
                    s[i]='a';
                    s[s.size()-1-i]='a';
                }
            }
        }
        if(s.size()%2) if(s[s.size()/2]=='.') s[s.size()/2]='a';
        //cout<<"s = "<<s<<endl;


        for(int i=0; i<s.size()/2; i++)//left string checking
        {
            if(s[i]=='.')
            {
                s[i]=s[s.size()-1-i];
            }
        }



        for(int i=s.size()-1,k=0; i>s.size()/2; i--,k++)//Right string checking
        {
            if(s[i]=='.')
            {
                s[i]=s[k];
            }
        }





        //cout<<" ss = "<<s<<endl;

        bool flag=true;
        for(int i=0; i<s.size()/2; i++)
        {
            if(s[i]!=s[s.size()-1-i])
            {
                flag=false;
            }
        }

        if(flag==false) cout<<"-1"<<endl;
        else cout<<s<<endl;


    }
}

http://ideone.com/9X5NIL

0 个答案:

没有答案