B. Vova and Trophies
题目原址
http://codeforces.com/contest/1082/problem/B
题目内容
给定一个包含GS字母的字符串,要求只允许进行一次GS交换,求所得最大连续G串长度。
题目解析
就是找在给定字符串s中,只间隔一个S的两个G串的最大长度。因为这中间的一个S可以被其他G换过来从而使得两个G串相连,成为最大连续G串。
注意:换过来的那个G可能来自于一个无关G串,也有可能只能来自本身的两个G串,因此还需要判断在交换后是否会获得长度收益。
举个例子,像SSSGGSGGS这样的字符串进行交换后最大长度 = 两串长度之和,而GSSGGSGG这样的字符串交换后最大长度 = 两串长度+1。
因此,除了寻找最大间隔串以外,还需对总体计数,如果两串之和 = 串中G的数量,则交换后没有收益,即
ans=min(ans,sum);
仔细回想一下如何寻找结果的。
遍历s串,先记录第一个连续的G串的长度,倘若遇到S则将结果先交给temp,然后重新记录第二个连续G串的长度,在遇到下一个S之前,ans内存储的就是这两个连续串的长度之和再+1交换收益(假设有的话)。
int sum = 0, g = 0, temp = 0, ans = 0; for(int i = 0; i < n; i++) { if(s[i] == 'G') { sum++; g++; } else { temp = g; g = 0; } ans=max(ans,temp+g+1); }
题目总结
反复回顾本题,就会逐渐学会字符串搜索之类的题目。
另:题官方的标签中给出了Greedy algorithm(贪婪算法)。
For you, Xh.