题目描述
样例1
输入
dbca
输出
10
样例2
输入
dbcad
输出
15
思路
遇到字符串的题就用哈希。
代码
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int maxn=1e5+5;
char s[maxn];
int b[maxn][11],n,h,mx,w;
long long ans;
vector<pair<int,int> >v;
map<int,vector<pair<int,int> > >mp;
map<int,vector<pair<int,int> > >::iterator it;
int main()
{
scanf("%s",s);
n=strlen(s);
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<=s[i]-'a';j++)b[i][s[i]-'a']+=b[i+1][j];
b[i][s[i]-'a']++;
for(int j=s[i]-'a'+1;j<10;j++)b[i][j]=b[i+1][j];
}
for(int i=0;i<10;i++)
for(int j=i;j<10;j++)
{
mp.clear();
for(int k=0;k<n;k++,h=0)
{
if(!b[k][i]||!b[k][j])continue;
for(int t=i+1;t<j;t++)h=(1LL*h*233333+b[k][t])%mod;
mp[h].push_back(make_pair(b[k][i],b[k][j]));
}
for(it=mp.begin();it!=mp.end();it++,mx=0)
{
v=(*it).second;sort(v.begin(),v.end());w=(int)v.size()-1;
if(i==j){ans+=v[w].first;continue;}
for(int k=w;k>=0;k--)
{
mx=max(mx,v[k].second);
if(!k)ans+=1LL*v[k].first*mx;
else ans+=1LL*(v[k].first-v[k-1].first)*mx;
}
}
}
printf("%lld",ans);
return 0;
}