http://acm.hdu.edu.cn/showproblem.php?pid=3819
分析:
由于最终要将两种字符分开,所以一开始,统计其中任一字符的总个数,也即最终会被放在一起的该字符的个数,suma;
然后,以此长度遍历字符串,找到所有子串中具有此字符最多的,而另外一种字符的个数也即需要交换的次数;
另者,需要注意其循环性。处理方法是从第i个字符(从该字符开始到最后一个字符的个数<suma,也即需要从前面取字符)开始到最后一个字符
代码:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
using namespace std;
#define M 100001
int ans[M];
int main()
{
//freopen("in.txt","r",stdin);
int t,i;
string s;
scanf("%d",&t);
for(int ccnt=1;ccnt<=t;ccnt++){
cin>>s;
int len=s.length();
int cnt=0;
for(i=0;i<len;i++){
if(s[i]==‘A‘) cnt++;
ans[i]=cnt;
}
int suma=ans[len-1];
int cnta=0,tmpa;
for(i=0;i+suma<len;i++){
tmpa= ans[i+suma] - ans[i];
if(tmpa>cnta) cnta=tmpa;
}
for(;i<len;i++){
tmpa=ans[len-1]-ans[i] + ans[suma-(len-i)];
if(tmpa>cnta) cnta=tmpa;
}
printf("Case %d: %d\n",ccnt,suma-cnta);
}
return 0;
}
hdu_3819 A and B Problem (字符串)
原文:http://blog.csdn.net/vuorange/article/details/18149273