糖糖的阿P 2022-03-27 19:37 采纳率: 100%
浏览 107
已结题

求字符串的子序列问题(语言-c++)

题目描述

众所周知,珂朵莉是世界上最幸福的女孩子;
但这道题目与幸福没有任何关系;
珂朵莉发现,对于任何一个字符串s都有一个珂学值,即其中含有子序列“chtholly”的个数
由于珂学崇尚壮阔,珂学值的结果可能很大

输入

第1行一个字符串S。

输出

共1行,一个整数,表示珂学值

提示

对于10%的数据,|S|<=8
对于30%的数据,|S|<=20
对于60%的数据,|S|<=1000
对于100%的数据,|S|<=100000
答案保证在可输出的范围内

我感觉应该是用dp 就写了一下
但是代码卡在60分过不去了 显示答案错误 请指教一下哪里出了问题QAQ

#include<bits/stdc++.h>
using namespace std;
string k={"chtholly"};
long long  f[100005][13];
char ch[100005];
int main()
{
   scanf("%s",&ch);
   int n=strlen(ch);
   for(int i=0;i<n;i++)
   {
        for(int j=0;j<=7;j++)
        {
            f[i+1][j+1]=f[i][j+1];

            if(k[j]==ch[i])
            {
            if(j==0)f[i+1][j+1]++;
            else
            f[i+1][j+1]+=f[i][j];

            }
        }
   }

   cout<<f[n][8];
    return 0;
}

ok啦!

#include<bits/stdc++.h>
using namespace std;
string k={"chtholly"};
string sum[8]={"0","0","0","0","0","0","0","0"};
char ch[200005];
string add(string  n,string  m)
{
   string x;
   int a=n.size(),b=m.size();
   int mins=min(a,b),temp=0,i;
   for( i=0;i<mins;i++)
   {
       int s=(int)n[i]+(int)m[i]-48*2+temp;
       if(s>9)temp=1;
       else temp=0;
       x+=(char)(s%10+48);
       //cout<<i<<" ";
   }
   while(i<a)
   {
       int s=(int)n[i++]-48+temp;
       if(s>9)temp=1;
       else temp=0;
       x+=(char)(s%10+48);
       // cout<<i<<" ";
   }
     while(i<b)
   {
       int s=(int)m[i++]-48+temp;
       if(s>9)temp=1;
       else temp=0;
       x+=(char)(s%10+48);
       // cout<<i<<" ";
   }
   if(temp)x+='1';
   //cout<<x<<endl;

    return x;
}
int main()
{
   scanf("%s",ch);
   int n=strlen(ch);
    string u="1";
   for(int i=0;i<n;i++)
   {
       if(ch[i]=='c')sum[0]=add(sum[0],u);
       for(int j=7;j>=1;j--)
       {
           if(ch[i]==k[j])sum[j]=add(sum[j-1],sum[j]);
       }

   }
    for(int i=sum[7].size()-1;i>=0;i--)cout<<sum[7][i];
    return 0;
}
  • 写回答

3条回答 默认 最新

  • Myajlk 2022-03-29 11:35
    关注
    
    vector<int>f[10];
    vector<int> add(vector<int> &A, vector<int> &B)
    {
        if (A.size() < B.size()) return add(B, A);
     
        vector<int> C;
        int t = 0;
        for (int i = 0; i < A.size(); i ++ )
        {
            t += A[i];
            if (i < B.size()) t += B[i];
            C.push_back(t % 10);
            t /= 10;
        }
     
        if (t) C.push_back(t);
        return C;
    }
     
    void solve(){
             
             string s;
             cin >> s;
             f[0].push_back(1);
             for(int i = 0 ; i < s.size() ; i ++ ){
                 if(s[i] == 'c') f[1] = add(f[0],f[1]) ;
                 if(s[i] == 'h') f[2] = add(f[1],f[2]) ;
                 if(s[i] == 't') f[3] = add(f[2],f[3]) ;
                 if(s[i] == 'h') f[4] = add(f[3],f[4]) ;
                 if(s[i] == 'o') f[5] = add(f[4],f[5]) ;
                 if(s[i] == 'l') f[7] = add(f[7],f[6]) ;
                 if(s[i] == 'l') f[6] = add(f[6],f[5]) ;
                 if(s[i] == 'y') f[8] = add(f[8],f[7]);
                  
             }
             reverse(f[8].begin(),f[8].end());
             for(auto i : f[8]) cout<<i;
              
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月29日
  • 已采纳回答 3月29日
  • 修改了问题 3月28日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题