这是个字符串问题。我们的字符串只包含大写字母。我们定义一个字母和它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;
}
单机测试成功了,但是挑战失败,与测试数据不符。谁能帮我分析下?