B. Diverse Substrings

题目链接:Problem - B - Codeforces

输入

7
1
7
2
77
4
1010
5
01100
6
399996
5
23456
18
789987887987998798

输出

1
2
10
12
10
15
106

题目大意就是给出T个用例给出一个长度为n,只包含'0'~'9'的字符串,在它所有的子串中,输出所有符合条件子串的个数

如果该个字符串每个字符出现的最大次数不超过所有出现字符的种类数就符合条件

/*
通过分析发现只有出现0~9的话,最种类数最多不超过10,最坏情况也就是每个字符都出现10次,也就是字符串最长不超过100,否则一定不符护条件
*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
using namespace std;
const int N=1e5+10;
int t,n;;
char s[N];
int sum[10][N];//记录每个字符出现次数的前缀和
int main(){
	cin>>t;
	while(t--){
		cin>>n;
		cin>>s+1;
		s[0]='/0';
		for(int i=1;i<=n;i++){
			for(int j=0;j<10;j++){
				sum[j][i]=sum[j][i-1]+(s[i]-'0'-j==0? 1:0);
			}
		}
		int Sum=0;
		for(int i=0;i<10;i++) Sum+=sum[i][n];
		int L=min(Sum,100);//取较小值
		int res=0;
		for(int l=1;l<=L;l++){//遍历所有长度子串
			for(int i=1;i+l-1<=n;i++){
				int x=-1;//同一个字符出现的最大次数
				int y=0;//子串种类数
				for(int k=0;k<10;k++){
					x=max(sum[k][i+l-1]-sum[k][i-1],x);
					y+=(sum[k][i+l-1]-sum[k][i-1]>0);
				}
				if(y>=x) res++;
			}
		}
		cout<<res<<endl;
}
}
posted @ 2022-11-17 16:09  突破铁皮  阅读(40)  评论(0编辑  收藏  举报