托米的咒语 牛客练习赛23 D

博客探讨了托米的咒语问题的两种暴力解法,包括基于子序列的C(3000,9)复杂度解法和基于字典序的9!复杂度解法。第一种解法由于复杂度过高可能导致TLE,而第二种在某些情况下可以接受,实际运行中3000*9!的时间复杂度在某些测试用例下能通过。" 112773838,10552154,使用PV操作实现并发进程的前趋图控制,"['并发控制', '操作系统', '编程语言', '数据结构', '算法']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:题目

全排列,暴力

第一种:对子序暴力,由题目可知,s<=3000,子序复杂度C(3000,9),根据组合数计算公式,复杂度大概是稍小于3000的阶乘

第二种哪个:对字典序暴力,把字典序全排列,复杂度是9的阶乘,还可以接受,继续往下考虑,遍历每一个字符串复杂度位s.size(),最大也就是3000,那么总时间复杂度位O(3000*9!),交的第一遍过了80%后TLE. 不死心,又点了一边提交,竟然卡过去了。。。

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<ctime>
using namespace std;
vector<char> dic;
int main(void) {
#ifndef ONLINE_JUDGE
    freopen("E:\\input.txt","r",stdin);
#endif
    ios::sync_with_stdio(false);
    for(int i=0; i<9; i++)
        dic.push_back('a'+i);
    string s;
    cin>>s;
    int res=0;
    do {
        int cnt=0,now=0,len=s.size();
        for(auto ch:dic) {//找子序
            while(now<len) {
                if(ch==s[now]) {
                    cnt++;
                    break;
                }
                now++;
            }
            if(now==len)
                break;
        }
        if(cnt==9)
            res++;
    } while(next_permutation(dic.begin(),dic.end()));//全排列字典序
    cout<<res<<endl;
#ifndef ONLINE_JUDGE
    printf("My Time:%.3lfms\n",(double)clock()/CLOCKS_PER_SEC);
#endif
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值