Acwing4261. 孤独的照片
创始人
2024-05-07 16:50:30

Farmer John 最近购入了 N 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。

奶牛目前排成一排,Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。

然而,他不想拍摄这样的照片,其中只有一头牛的品种是更赛牛,或者只有一头牛的品种是荷斯坦牛——他认为这头奇特的牛会感到孤立和不自然。

在为每个连续不少于三头奶牛的序列拍摄了一张照片后,他把所有「孤独的」照片,即其中只有一头更赛牛或荷斯坦奶牛的照片,都扔掉了。

给定奶牛的排列方式,请帮助 Farmer John 求出他会扔掉多少张孤独的照片。

如果两张照片以不同位置的奶牛开始或结束,则认为它们是不同的。

输入格式

输入的第一行包含 N。

输入的第二行包含一个长为 N 的字符串。如果队伍中的第 i 头奶牛是更赛牛,则字符串的第 i 个字符为 G。否则,第 i 头奶牛是荷斯坦牛,该字符为 H

输出格式

输出 Farmer John 会扔掉的孤独的照片数量。

数据范围

3≤N≤5×10^5

输入样例:

5
GHGHG

输出样例:

3

样例解释

这个例子中的每一个长为 3 的子串均恰好包含一头更赛牛或荷斯坦牛——所以这些子串表示孤独的照片,并会被 Farmer John 扔掉。

所有更长的子串(GHGHHGHG 和 GHGHG)都可以被接受。

AC代码 

#include 
#include 
#include using namespace std;
typedef long long LL;
const int N = 500010;
int l[N], r[N];//左右两边分别有几个与自身不一样的连续的字母
char str[N];
int n;
int main()
{cin >> n;cin >> str;for (int i = 0, h = 0, g = 0; i < n; i ++ )//处理l[i]if (str[i] == 'G') l[i] = h, h = 0, g ++ ;else l[i] = g, g = 0, h ++ ;for (int i = n - 1, h = 0, g = 0; i >= 0; i -- )//处理r[i]if (str[i] == 'G') r[i] = h, h = 0, g ++ ;else r[i] = g, g = 0, h ++ ;LL res = 0;for (int i = 0; i < n; i ++ )res += (LL)l[i] * r[i] + max(l[i] - 1, 0) + max(r[i] - 1, 0);cout << res << endl;return 0;
}

 

遍历整个字符串,对于每一个位置处的字母,分别处理一下,l[i]和r[i],即为左右两边分别有几个与自身不一样的连续的字母,例如对于某一点i处的任意字母,分上图三种情况再遍历一次计算符合条件的数量最后累加起来就是最终的答案。

 

相关内容

热门资讯

脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...