首页 > 其他分享 >ACWING 4261. 孤独的照片

ACWING 4261. 孤独的照片

时间:2023-01-09 15:55:32浏览次数:42  
标签:4261 孤独 字符 ++ s1 两边 预处理 特殊字符 ACWING

题意:

给一个长度为n的只包含'G'和'H'字符串

要求统计所有长度>=3且只有一个不一样的字符的子串个数

思路:

最开始的思路就是

找到一个满足的三个字符

然后向两边扩展

然后就寄了

先不论时间复杂度

每添加一个字符并不是贡献+1

然后就换了一种思路

每次碰到那个特殊字符在中间就向两边扩展看看两边的数字是多少

然后贡献等于x * y

然鹅发现贡献并不是这么多

比如GGHGG的贡献是6

通过这种方法算出来只有4

看了题解

原来还要考虑那个特殊字符在两边的情况

上面那种情况算漏的情况就是GGH和HGG

分别代表特殊字符在最左边和特殊字符在最右边

贡献分别为max(0,y - 1)和max(0,x - 1)

但是我看题解算每个字符两边有各有多少个不同的字符的方法跟我不一样

他是用两个数组预处理了一波就行了

先预处理每个字符左边不同字符数量

如果当前字符是'G'就看当前的h数量如何

同时清零h,g++

如果当前字符是'H'就看当前的g数量如何

同时清零g,h++

右边的预处理反着来就行了

处理完以后就得到了每个字符两边不同字符的长度

然后就累加三种贡献即可

代码:

void solve()
{
	string s1;
	cin >> n;
	cin >> s1;
	s1 = " " + s1;
	for(int i = 1,g = 0,h = 0;i <= n;i++)
	{
		if(s1[i] == 'G') l[i] = h,h = 0,g++;
		else l[i] = g,g = 0,h++;
	}
	for(int i = n,g = 0,h = 0;i >= 1;i--)
	{
		if(s1[i] == 'G') r[i] = h,h = 0,g++;
		else r[i] = g,g = 0,h++;
	}
	// for(int i = 1;i <= n;i++) cout << l[i] << " ";
	// cout << endl;
	// for(int i = 1;i <= n;i++) cout << r[i] << " ";
	// cout << endl;
	int ans = 0;
	for(int i = 1;i <= n;i++)
	{
		ans += max(r[i] - 1,0ll);
		ans += max(l[i] - 1,0ll);
		ans += l[i] * r[i];
	}
	cout << ans << endl;
}

总结:

这里感觉最难想到的就是用两个数组去统计每个字符左边和右边的连续的不同字符的个数

所以感觉for循环里面套while行不通的话就可以想想这种方法

感觉预处理就比较有用.

   

标签:4261,孤独,字符,++,s1,两边,预处理,特殊字符,ACWING
From: https://www.cnblogs.com/rickly233/p/17037287.html

相关文章

  • ACWING 4645. 选数异或
    url:4645.选数异或-AcWing题库题意:给n个数,再给m次查询,给一个数x每次询问给一个区间l,r,问是否能从$[l,r]$中选出两个下标不同的数使得它们的异或值等于x 思路......
  • ACWING 4366. 上课睡觉
    url:4366.上课睡觉-AcWing题库题意:给n个石堆,相邻石堆可以合并现在要求每个石堆都相等,问最少合并多少次思路:由于不管咋个合并,石子数是不会变的那么就可以枚举......
  • AcWing第85场周赛
    这场周赛是手速局hh死或生某国正在以投票的方式决定2名死刑犯(编号1∼2)的生死。共有n组人员(编号1∼n)参与投票,每组10人。每组成员只参与一名死刑犯的投票,其中第......
  • AcWing杯 第 84 场周赛
    A.最大数量签到,用了结构化绑定#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intread(){...}int32_tmain(){intn=read();map......
  • AcWing395. 冗余路径
    题目大意\(\qquad\)给定一张无向图,求至少增加多少条边才能将这张图变成一个e-dcc边双连通分量。解题思路\(\qquad\)从边双的性质入手:$$边双连通分量内部的两个点之间至......
  • Acwing第 85 场周赛 ABC
    https://www.acwing.com/activity/content/2755/4791.死或生题目大意:给定n组(10个人)对2个犯人(编号1,2)的生死评价,总数:生>=死,活下来,否则嘎了输入样例1:2155264输......
  • AcWing 4366. 上课睡觉
    AcWing4366.上课睡觉好久没写题,一写就发现脑子生锈了(。题目描述有\(N\)堆石子,每堆的石子数量分别为\(a_1,a_2,⋯,a_N\)。你可以对石子堆进行合并操作,将两个相邻......
  • AcWing.1175 最大半连通子图
    题目描述\(\qquad\)一个有向图\(G=(V,E)\)称为半连通的,如果满足:\(\forallu,v\inV\),满足\(u\tov\)或\(v\tou\),即对于图中任意两点\(u,v\),存在一条\(u\)到......
  • 孤独的照片【USACO 2021 December Contest Bronze】
    孤独的照片FarmerJohn最近购入了\(N\)头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。奶牛目前排成一排,FarmerJohn想要为每个连续不少于三头奶......
  • AcWing4655.重新排序
    题目原题链接参考题解AcWing4655.重新排序思路用两个数组,一个数组\(a\)来记录原数组,\(b\)数组来记录每个数字被计算了多少次,题目中给的是$[l,r]$区间内的数字求和,......