Kirinriki
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1822 Accepted Submission(s): 749
disA,B=∑i=0n−1|Ai−Bn−1−i|
The difference between the two characters is defined as the difference in ASCII.
You should find the maximum length of two non-overlapping substrings in given string S, and the distance between them are less then or equal to m.
Each case begins with one line with one integers m : the limit distance of substring.
Then a string S follow.
Limits
T≤100
0≤m≤5000
Each character in the string is lowercase letter, 2≤|S|≤5000
∑|S|≤20000
2
abcd
####0-1=1
####0-2=3
****0-2=1
l ---->0
^^^^0-2=-1
####0-2=1
####0-3=4
****0-3=1
l ---->0
^^^^0-3=-2
####0-3=1
####1-2=2
2
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=20005;
char s[maxn];
int m,len;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&m);
scanf("%s",s);
len=strlen(s);
int ans=0;
for(int i=0;i<len;i++)
{
int t=0,res=0,l=0;
for(int j=0;j<(i+1)/2;j++)
{
res+=abs(s[j]-s[i-j]);
//printf("####%d-%d=%d\n",j,i-j,ans);
if(res<=m)
{
t++;
ans=max(t,ans);
}
else
{
res-=abs(s[j]-s[i-j]);
//printf("****%d-%d=%d\n",j,i-j,ans);
res-=abs(s[l]-s[i-l]);
//printf("l ---->%d\n",l);
//printf("^^^^%d-%d=%d\n",j,i-j,ans);
l++,t--,j--;
}
}
}
reverse(s,s+len);
//cout<<s<<endl;
for(int i=0;i<len;i++)
{
int t=0,res=0,l=0;
for(int j=0;j<(i+1)/2;j++)
{
res+=abs(s[j]-s[i-j]);
if(res<=m)
{
t++;
ans=max(t,ans);
}
else
{
res-=abs(s[j]-s[i-j]);
res-=abs(s[l]-s[i-l]);
l++,t--,j--;
}
}
}
printf("%d\n",ans);
}
}