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; }