之前第一次遇见没有想明白 第二次必须狠狠的pass掉
一:回文子串
对于一个串能够构成回文的形式 我们需要知道他应该满足以下特征:
1:如果这个串长度为偶数 那么所有字符的出现次数必须都为偶数(0110、011110等)
2:如果这个串长度为奇数 那么所有字符中出现奇数次数的字符最多有一个(0112110)
综上 - 我们知道如果一个串能构成回文串 那么他的所有字符中出现次数为奇数次的字符不超过1个
那么,我们可以记录区间内字符们的出现次数 为了方便统计设置1为奇数次 0为偶数次
而又因为奇-偶 = 奇 偶 - 奇 = 奇
所以两个区间满足
1.只有一个数不一样的时候 说明有一个字符出现了奇数次 因为其他的字符数相减都是偶数
2.所有的数字都相同 两区间内的所有数字出现个数相减都为偶数(0)
最后统计区间的个数即可
/* */
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAX = 1e5+7;
void solve()
{
string s;
cin>>s;
map<vector<int>,int>mp;
vector<int>cnt(10,0);
//cnt[i] - i这个数字出现了几次 1-奇数次 0-偶数次
mp[cnt]++;//初始化都没出现 都是偶数
int ans = 0;
for(int i=0;i<s.size();i++)
{
cnt[s[i]-'0']^=1;//开始是0 异或1变成1 之后再出现异或1变成0
ans += mp[cnt];//加上和他完全一样的区间数
for(int j=0;j<10;j++)
{
//统计只有一个数字出现次数不一样的区间
vector<int>tem;
tem = cnt;
tem[j] ^= 1;
ans+=mp[tem];
}
mp[cnt]++;//每次结束之后 这个区间数+1
}
cout<<ans;
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);
cout.tie(0);
//cout<<fixed<<setprecision(2);
int t=1;
//cin>>t;
while(t--)
solve();
return 0;
}
下次不会再忘了(●'◡'●)