作者:
y总的小迷弟
,
2023-02-01 18:00:42
,
所有人可见
,
阅读 5
1、首先说前面相乘是什么情况–GGGHGGGG,比如这样的情况的牛,左边取1头G右边取1头加上中间H,就组成了GHG,这就是一个孤独的牛,需要删掉,然后右边取到GGGG都是一样,可以组成孤独的牛,然后在左边取两头,右边全部取,这样就是两个数的乘积的结果,
2、然后加上左边 - 1的长度,需要满足长度是3,所以左边是GGGH,左边不同的牛长度是3,你不能直接就取3,要留出一个组成跟中间点组成GH来达到长度是3,所以就是左边剩下两头G,取一头跟两头可以组成两种情况 ,就有G+GH , GG + GH,这样两种情况就是左边长度 - 1;
3、右边同理
import java.util.*;
import java.io.*;
public class Main{
static int N = 500010;
static char[] g = new char[N];//存储所有牛
public static void main(String[] args)throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PrintWriter wt = new PrintWriter(new OutputStreamWriter(System.out));
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(bf.readLine());//输入n
g = bf.readLine().toCharArray();//输入所有牛
long res = 0;
for (int i = 0 ; i < n ; i ++){ //枚举所有牛
int lhs = 0; //当前这头牛的左边不同的连续的牛
//i > 0保证了左边这头牛,如果是=0,那么左边没有牛
//并且左边跟他不相等的数的长度
if (i > 0 && g[i] != g[i - 1]){
lhs ++;
//然后看左边最长不超过边界的最长的不同的牛
for (int j = i - 2;j >= 0 && g[j] != g[i]; j -- ) lhs ++;
}
int rhs = 0;//当前这头牛的右边不同的连续的牛
//i + 1 < n 保证了右边这头牛,如果是>n,那么右边超过边界没有牛
//并且右边跟他不相等的数的长度
if (i + 1 < n && g[i + 1] != g[i]){
rhs ++;
//然后看右边最长不超过边界的最长的不同的牛
for (int j = i + 2 ; j < n && g[j] != g[i]; j ++) rhs ++;
}
//每次累加所有的牛的应该扔掉的孤独照片
//左边跟右边的所有点都可以跟中间当前点组成
//(左边长度*右边长度 + 左边的长度 - 1 + 右边的长度 - 1)
///为什么左边减1呢,因为长度最低是3,所以要留出 一个当前点跟左边一个点,
//然后跟左边其他点组成3以上的长度,右边同理
res += (long)lhs * rhs + (long)Math.max(0,lhs - 1) + (long)Math.max(0,rhs - 1);
}
System.out.println(res);
wt.flush();
}
}