#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e2 + 10;
const int mod = 998244353;
map<vector<int>,int> mp; //开一个以数组为键的mp,用来统计每种状态的个数(0-9的出现次数奇偶情况)
void solve(){
string s;
cin>>s;
int n = s.size();
ll ans = 0;
vector<int> tmp;
for (int i = 0; i < 10; ++i) { //初始化全为0,所有字符出现次数都为0
tmp.push_back(i);
}
mp[tmp]++;
/**
* 这个类似区间和的求法,我们从1开始统计每个元素出现次数的奇偶性质
* 能构成回文区间的只有两种情况
* 1 状态相同的
* 2 状态只有一位不同的
*/
for (int i = 0; i < n; ++i) {
tmp[s[i] - '0'] ^= 1; //更新当前字符个数奇偶性 为1个数为奇数,为0个数为偶数
ans += mp[tmp];
/**
* 答案加上前面和当前状态相同的区间,可以和当前区间构成回文区间
* 原因如下:1状态相同,做差后只会出现偶减偶/奇减奇
* 2偶减偶/奇减奇的区间段内,元素的个数一定为偶数
*/
for (int j = 0; j < 10; ++j) {
vector<int> tt = tmp;
tt[j] ^= 1; 枚举所有和当前状态只有一个字符奇偶性不同的状态
//异或1相当于对某一位进行奇偶变换
ans += mp[tt];
}
mp[tmp]++;
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
//cin>>t;
while(t--){
solve();
}
return 0 ;
}
牛客周赛32——小红的回文串
最新推荐文章于 2024-08-28 21:25:50 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)