找包含特征量相同的字串数量
技巧
技巧
技巧
可以设置一个状态量,表示当前每个特征字符的数量
可以设置一个状态量,表示当前每个特征字符的数量
可以设置一个状态量,表示当前每个特征字符的数量
相当于一个
i
一直向后推进,然后一直加符合题意的状态量
相当于一个i一直向后推进,然后一直加符合题意的状态量
相当于一个i一直向后推进,然后一直加符合题意的状态量
两个字符相同的例子
//找字串中'0','1'字符相同的字串数量
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
string s;
int cnt[N];
int main()
{
cin >> n;
cin >> s;
int res = 0;
int cnt_1 = 0;
cnt[0] = 1;
for(auto t : s)
{
if(t == '1')
{
cnt_1 ++;
res += cnt[cnt_1];
cnt[cnt_1] ++;
}
else
{
cnt_1 --;
res += cnt[cnt_1];
cnt[cnt_1] ++;
}
}
cout << res << endl;
return 0;
}
三个字符相同的例子
链接牛客例题
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int t, n;
map<pair<int, int>, int> cnt;
int main()
{
cin >> t;
while(t --)
{
long long res = 0;
cnt.clear();
cnt[{0,0}] = 1;
int cnt_0 = 0;
int cnt_1 = 0;
cin >> n;
string s;
cin >> s;
for(auto t: s)
{
if(t == '1')
{
cnt_1 ++;
res += cnt[{cnt_0, cnt_1}];
cnt[{cnt_0, cnt_1}] ++;
}
else if(t == '0')
{
cnt_0 ++;
res += cnt[{cnt_0, cnt_1}];
cnt[{cnt_0, cnt_1}] ++;
}
else{
cnt_0 --;
cnt_1 --;
res += cnt[{cnt_0, cnt_1}];
cnt[{cnt_0, cnt_1}] ++;
}
}
cout << res << endl;
}
return 0;
}