求反向互补字符串长度

这是个字符串问题。我们的字符串只包含大写字母。我们定义一个字母和它13位以后的字母互补。即A与N互补,B与O互补,C与P互补……,我们需要找一个字符串的两个不重叠的子串,其中一个和另外一个的翻转全互补。另外,因为我们的问题来自生物学,所以我们允许这两个字符串的一个可以删掉两个字符(注意:仅允许一个字符串删掉任意位置的两个字符,另外一个必须全部互补上)。我们的目的是求最长的反向互补子串的长度。

输入格式:

多组数据,每组数据一行,有一个字符串。每个字符串长度不超过2000,只有大写英文字母组成。

输出格式:

每组数据输出一行包含一个整数,表示最长的反向互补子串长度。


#include <iostream>
using namespace std;
int cntStr(char* _ch);
int* alltimes(int* src,int a,int b,int dir);
int main()
{
    while(1)
    {
        char str[2000];
        cin>>str;
        cout<<cntStr(str)<<endl;
    }
    return 0;
}
int cntStr(char* _ch)
{
    int cnt;
    int cnts[0xFFFF];
    string str=_ch;
    int len =str.length();
    int scr[13]={2,3,5,7,11,13,17,19,23,31,37,41,43};
    int source[2000];
    source[0]=len;
    for (int i=1;i<len+1;i++)
    {
        if (int(str[i-1])>int('M'))
        {
            source[i]=-(scr[int(str[i-1])-int('M')]);
        }
        else
        {
            source[i]=scr[int(str[i-1])-int('A')+1];
        }
    }
    int index=1;
    for (int i=1;i<len;i++)
    {
        for (int j=i+1;j<len+1;j++)
        {
            int* c=alltimes(source,i,j,0);
            cnts[2*index-1]=c[0];
            cnts[2*index]=c[1];
            cnts[0]=2*index;
            index++;
        }
    }
    for (int i=0;i<cnts[0]-1;i++)
    {
        for (int j=i+1;j<cnts[0];j++)
        {
            if(cnts[i]<cnts[j])
            {
                int swp=cnts[i];
                cnts[i]=cnts[j];
                cnts[j]=cnts[i];
            }
        }
    }
    return cnt=cnts[1];
}

int* alltimes(int* src,int a,int b,int dir)
{
    int len[2]={0,0};
    if ((b>a)&&b<=src[0])
    {
        if (dir==0)
        {
            if (src[a]+src[b]==0)
            {
                len[0]++;
                len[1]++;
                int* c=alltimes(src,a+1,b-1,0);
                len[0]+=c[0];
                len[1]+=c[1];
            }
            else
            {
                len[0]+=alltimes(src,a+1,b,1)[0];
                len[1]+=alltimes(src,a,b-1,-1)[1];
            }
        }
        else if (abs(dir)>1)
        {
            if (src[a]+src[b]==0)
            {
                int* c =alltimes(src,a+1,b-1,dir);
                if (dir > 0)
                {
                    len[0]++;
                    len[0]+=c[0];
                }
                else
                {
                    len[1]++;
                    len[1]+=c[1];
                }
            }
        }
        else if (abs(dir)>0)
        {
            if (src[a]+src[b]==0)
            {
                int* c =alltimes(src,a+1,b-1,dir);
                if (dir > 0)
                {
                    len[0]++;
                    len[0]+=c[0];
                }
                else
                {
                    len[1]++;
                    len[1]+=c[1];
                }
            }
            else
            {
                if (dir > 0)
                {
                    len[0]+=alltimes(src,a+1,b,2*dir)[0];
                }
                else
                {
                    len[1]+=alltimes(src,a,b-1,2*dir)[1];
                }
            }
        }
    }
    return len;
}

单机测试成功了,但是挑战失败,与测试数据不符。谁能帮我分析下?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值