题目意思 :给你一个字符串(每个字符只有'0'到'9'),问他有多少个子串是“不同的”
对“不同的”的定义是:字符串中每个字符的出现次数不超过其中不同字符的数量,则该字符串是不同的,
思路:暴力,但是怎么暴力就是个问题,我们从最多的情况上看,因为最多就10种字符,那么最多也就只有100个字符串以内有“不同的”字符串,那么直接暴力从1到n,然后遍历100位就好了。
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;
const int N=1000000+100;
int n ,m,h;
char s[N];
int ss[N];
map<int,int>q;
int main()
{
int t;
sc_int(t);
while(t--)
{
sc_int(n);
cin>>s+1;
for(int i =1;i<=n;i++)
ss[i]=s[i]-'0';
int res=0;
for(int i =1;i<=n;i++)
{
q.clear();
int sum=0,maxn=0;;
for(int j =i;j<=i+102&&j<=n;j++)
{
if(!q[ss[j]])sum++;
q[ss[j]]++;
maxn=max(maxn,q[ss[j]]);
if(maxn<=sum)res++;
}
}
cout<<res<<endl;
}
return 0;
}