众所周知,珂朵莉是世界上最幸福的女孩子;
但这道题目与幸福没有任何关系;
珂朵莉发现,对于任何一个字符串s都有一个珂学值,即其中含有子序列“chtholly”的个数
由于珂学崇尚壮阔,珂学值的结果可能很大
输入
第1行一个字符串S。
输出
共1行,一个整数,表示珂学值
样例输入 Copy
cchhtthhoollllyy
样例输出 Copy
384
提示
对于10%的数据,|S|<=8
对于30%的数据,|S|<=20
对于60%的数据,|S|<=1000
对于100%的数据,|S|<=100000
答案保证在可输出的范围内
转移过程:
注意此题范围s最大100000,可看出若十个不同且按序则有1000的十次方超long long需高精
accode:
#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
const int N =1e5+10;
typedef long long ll;
string dp[9][N];
int c[N],d[N],l,k,p;
string Add(string as,string b)
{
for(int i=0;i<=as.size()+1000;i++)
c[i]=0;
for(int i=0;i<=b.size()+1000;i++)
d[i]=0;
string ans;
l=as.size(),k=b.size();
for(int i=0;i<l;i++)
c[l-i-1]=as[i]-'0';
for(int j=0;j<k;j++)
d[k-j-1]=b[j]-'0';
p=max(l,k);
for(int i=0;i<p;i++)
{
c[i]+=d[i];
c[i+1]+=c[i]/10;
c[i]%=10;
}
for(;c[p];p++);
for(int i=p-1;i>=0;i--)
ans+=c[i]+'0';
return ans;
}
int main()
{
string a,b;
cin>>a;
b="chtholly";
for(int i=0;i<a.size()+1;i++)
dp[0][i]="1";
for(int i=1;i<b.size()+1;i++)
{
for(int j=1;j<a.size()+1;j++)
{
dp[i][j]=dp[i][j-1];
if(b[i-1]==a[j-1])
{
dp[i][j]=Add(dp[i][j],dp[i-1][j-1]);
}
}
}
cout<<dp[b.size()][a.size()]<<"\n";
return 0;
}