列表

详情


NC248906. 数据结构

描述

你有一个长度为n的字符串,其中仅含'0','1','2'三个字符。
你希望知道,这个字符串有多少个子串,满足该子串的'0','1','2'个数相等?

输入描述

第一行一个正整数,代表数据组数t(1\le t \le 10^4)
对于每组数据,第一行一个正整数n(1\le n \le 3\cdot 10^5),接下来一行一个长度为n的仅含'0','1','2'的字符串。
保证所有的n之和不超过3\cdot 10^5

输出描述

对于每组数据,一行一个正整数表示答案。

示例1

输入:

4
3
012
6
001122
18
102100120120120012
18
012012012012012012

输出:

1
1
25
51

说明:

对于前两个样例,仅有串本身满足条件。
对于第三个样例,举一个满足条件的子串:从第3个字符到第8个字符的子串210012满足条件。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 145ms, 内存消耗: 19788K, 提交时间: 2023-03-18 17:28:02

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		string temp;
		cin>>n>>temp;
		int x=0,y=0;
		map<pair<int,int>,int > cha;
		cha[{0,0}]=1; 
		long long ans=0;
		for(int i=0;i<n;i++){
			if(temp[i]=='0'){
				x++,y++;
			}else if(temp[i]=='1'){
				x--;
			}else y--;
			ans+=cha[{x,y}];
			cha[{x,y}]++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 102ms, 内存消耗: 19476K, 提交时间: 2023-03-26 12:15:43

#include<bits/stdc++.h>
using namespace std;
int arr[200];
int main()
{
	int t,n;
	string s;
	cin>>t;
	while(t--)
	{
		long long res=0;
		map<pair<int,int>,int> ma;
		memset(arr,0,sizeof(arr));
		cin>>n>>s;
		ma[{0,0}]=1;
		for(int i=0;i<n;i++)
		{
			arr[s[i]]++;
			res+=ma[{arr['2']-arr['1'],arr['1']-arr['0']}]++;
		}
		cout<<res<<endl;
	}
}



Python3 解法, 执行用时: 520ms, 内存消耗: 50548K, 提交时间: 2023-03-18 22:45:45

t=int(input())
for __ in range(t):
    n=int(input())
    s=input()
    cnt=dict(zip("012",[0]*3))
    res={(0,0):1}
    ans=0
    for i in s:
        cnt[i]+=1;
        sta=(cnt['0']-cnt['1'],cnt['1']-cnt['2'])
        ans+=res.get(sta,0)
        if sta in res:res[sta]+=1
        else:res[sta]=1

    print(ans)

上一题