话说实验室有个胖子叫小明,还有个瘦的叫小兵,小兵他已经来了好几天啦,老师也一直叫他练打英文字母,小兵就没有小明听话,他老是偷懒,老师想让他动动脑筋,于是就给他出了个问题来惩罚他偷懒。现在我们把两个英文字母的ASCII码的差的绝对值称为这两个字符的“距离”,如果给你一个字符串和上面定义的“距离”的值,问小兵在这个串里最长的连续的子串有多长?当然这个子串的任意两个字符的距离一定不超过给定的距离值!亲爱的同学们,如果你们同情瘦个子小兵,那么你就帮他写个程序,计算一下符合要求的子串最长到底是多少?
Input
假定字符串都是由英文小写字母组成的,长度不超过100000。输入有两行,第一行是整数d即指给定的距离值,d>=0;另一行是字符串。
Output
输出也有两行,第一行的格式是:“From=XX,To=XX”,第二行的格式是:“MaxLen=XX”。本问题有多组测试数据。如果有多组符合要求的解,那么输出起始位置最小的解。
Sample Input
2
vdtjajcrnamkzequrcnojumsjnbyzsotkebnrkycbvbmcsqdvjght
15
hpenlvlknkrtpmkmkbxcpbbpxxipxmgxnysryttuowyxppgmndoxzizdilnjdqawieab
Sample Output
From=11,To=12
MaxLen=2
From=32,To=46
MaxLen=15
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
char s[MAXN];
int cnt[26],anslen,pos,k;
bool ck()
{
int min1=27;
int max1=-1;
for(int i=0;i<26;++i)
{
if(cnt[i])min1=min(min1,i),max1=max(max1,i);
}
return max1-min1<=k;
}
int main()
{
while(scanf("%d",&k)!=EOF)
{
anslen=0;
pos=0;
memset(cnt,0,sizeof(cnt));
scanf("%s",s+1);
int l=1;
for(int i=1;s[i];++i)
{
cnt[s[i]-'a']++;
while(!ck())
{
cnt[s[l]-'a']--;
++l;
}
if(anslen<i-l+1)
{
anslen=i-l+1;
pos=l;
}
else if(anslen==i-l+1)
{
if(pos>l)pos=l;
}
}
printf("From=%d,To=%d\nMaxLen=%d\n",pos,pos+anslen-1,anslen);
}
return 0;
}