一些题目呗

Let's call a binary string TT of length mm indexed from 11 to mm paranoid if we can obtain a string of length 11 by performing the following two kinds of operations m-1m−1 times in any order :

  • Select any substring of TT that is equal to 01, and then replace it with 1.

  • Select any substring of TT that is equal to 10, and then replace it with 0.

For example, if T =T= 001, we can select the substring [T_2T_3][T2T3] and perform the first operation. So we obtain T =T= 01.

You are given a binary string SS of length nn indexed from 11 to nn. Find the number of pairs of integers (l, r)(l,r) 1 \le l \le r \le n1≤lrn such that S[l \ldots r]S[lr] (the substring of SS from ll to rr) is a paranoid string.

Input

The first line contains an integer tt (1 \le t \le 10001≤t≤1000) — the number of test cases. The description of test cases follows.

The first line of each test case contains a single integer nn (1 \le n \le 2 \cdot 10^51≤n≤2⋅105) — the size of SS.

The second line of each test case contains a binary string SS of nn characters S_1S_2 \ldots S_nS1S2…Sn. (S_i =Si= 0 or S_i =Si= 1 for each 1 \le i \le n1≤in)

It is guaranteed that the sum of nn over all test cases doesn't exceed 2 \cdot 10^52⋅105.

Output

For each test case, output the number of pairs of integers (l, r)(l,r) 1 \le l \le r \le n1≤lrn such that S[l \ldots r]S[lr] (the substring of SS from ll to rr) is a paranoid string.

Sample 1

Inputcopy

Outputcopy

5

1

1

2

01

3

100

4

1001

5

11111

1

3

4

8

5

Note

In the first sample, SS already has length 11 and doesn't need any operations.

In the second sample, all substrings of SS are paranoid. For the entire string, it's enough to perform the first operation.

In the third sample, all substrings of SS are paranoid except [S_2S_3][S2S3], because we can't perform any operations on it, and [S_1S_2S_3][S1S2S3] (the entire string).

这个题目的意思是给你一个字符串就是1001010什么什么的,然后你可以吧01变成1,10变成0,就是保留右边,所以我们要从右边开始找,就OK了

#include <stdio.h>
#include <string.h>
int main()
{
    int i,a,len;
    int n;
    char arr[1000000];
    scanf("%d",&n);
    while(n--)
    {
        long long sum=0;
        scanf("%d",&a);
        scanf("%s",arr);
        len=strlen(arr);
        for(i=len-1;i>=0;i--)
        {
            if(i==0) sum++;
            else
            {
                if(arr[i]=arr[i-1]) sum++;
                else sum=sum+i+1;
            }
        }
        printf("%lld\n",sum);
    }
}

复习高数!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值