【题目来源】:http://acm.nyist.me/JudgeOnline/problem.php?id=2347
【题意】
中问题已不再叙述,,,
【思路】
根据题意的描述,这个字串中对于任何的i,都符合Ai=Ai+2.所以奇数位上的字符都相同,偶数位同理。如果有一个子串两个条件都满足那么这个子串就可以当做答案之一了,但是可以修改k个字符,答案还可以贪心增长。我们单独考虑奇偶位上的字符,最优策略当然是保留出现次数最多的那个,我们可以用两点法(尺取?滑动窗?),每一步都找两种情况中出现频率最多的字符,这个可以用26*2的数组来统计,遍历一遍找出最优解即可。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[26][2];
char str[1000000+10];
int main()
{
int k;
while(~scanf("%d%*c",&k))
{
scanf("%s",str);
int len=strlen(str);
int j=0,max_len=0;
memset(num,0,sizeof(num));
for(int i=0;i<len;i++)
{
if(i>0) num[str[i-1]-'a'][(i-1)&1]--;//每次经历过循环后,都把第一个减去,也就是遍历所有区间
int ji=0,ou=0;
for(int w=0;w<26;w++)
{
ji=max(ji,num[w][0]);
ou=max(ou,num[w][1]);
}
int ans=j-i-ji-ou;//需要变形的
while(ans<=k&&j<len)//继续往后加
{
num[str[j]-'a'][j&1]++;
ji=max(ji,num[str[j]-'a'][0]);
ou=max(ou,num[str[j]-'a'][1]);
j++;
ans=j-i-ji-ou;
if(j-i>max_len&&ans<=k)
max_len=j-i;
}
}
printf("%d\n",max_len);
}
}