HNU 13108-Just Another Knapsack Problem (ac自动机上的dp)

题意:

给你一个母串,多个模式串及其价值,求用模式串拼接成母串(不重叠不遗漏),能获得的最大价值。

分析:

ac自动机中,在字典树上查找时,用dp,dp[i]拼成母串以i为结尾的子串,获得的最大价值,dp[i]=max(dp[i],dp[i-len]+val[tmp])。,len是模式串的长度,val[tmp]为其价值。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
#include<iostream>
using namespace std;
const int maxnode = 300010;
const int sigma_size = 26;
struct Trie{
    int dp[100010];
    int ch[maxnode][sigma_size];
    int val[maxnode];     //该单词在模式串中出现的次数
    int last[maxnode];
    int f[maxnode];         //失配数组
    int num[maxnode];     //该单词出现在文本串的次数
    int pre[maxnode];    //该单词的前驱
    int len[maxnode];    //以该单词结尾的单词长度
    int Char[maxnode];     //该单词对应的字母
    int road[maxnode];   //路径压缩优化 针对计算模式串出现的种数
    int sz;
    int Newnode()
    {
        val[sz] = f[sz] = last[sz] = len[sz] = num[sz] = 0;
        memset(ch[sz], 0, sizeof ch[sz]);
        return sz++;
    }
    void init(){
        sz=0;
        Newnode();
    }
    int idx(char c){ return c-'a'; }
    void build(char *s,int v){
        int u = 0;
        for(int i = 0, c; s[i] ;i++){
            c = idx(s[i]);
            if(!ch[u][c])
                ch[u][c] = Newnode();
            pre[ch[u][c]] = u;
            Char[ch[u][c]] = s[i];
            len[ch[u][c]] = len[u]+1;
            road[ch[u][c]] = 1;
            u = ch[u][c];
        }
        val[u] = max(val[u],v);
        //num[u] = 0;
        //return u;
    }
   void getFail(){
        queue<int> q;
        for(int i = 0; i<sigma_size; i++)
            if(ch[0][i]) q.push(ch[0][i]);
        int r, c, u, v;
        while(!q.empty()){
            r = q.front(); q.pop();
            for(c = 0; c<sigma_size; c++){
                u = ch[r][c];
                if(!u)continue;
                q.push(u);
                v = f[r];
                while(v && ch[v][c] == 0) v = f[v]; //沿失配边走上去 如果失配后有节点 且 其子节点c存在则结束循环
                f[u] = ch[v][c];
            }
        }
    }
    void find(char *T){
    //计算模式串出现的个数:(每种多次出现算多次)
        int j = 0,l=strlen(T);
        for(int i = 0, c, temp; i<l ; i++){
                dp[i]=0;
            c = idx(T[i]);
            while(j && ch[j][c]==0) j = f[j];
            j = ch[j][c];

            temp = j;
            while(temp){
                if(val[temp]){
                    if(i-len[temp]<0)
                        dp[i]=max(dp[i],val[temp]);
                    else if(dp[i-len[temp]])
                        dp[i]=max(dp[i],dp[i-len[temp]]+val[temp]);
                }
                temp = f[temp];
            }
        }
        printf("%d\n",dp[l-1]);
    }
    int find_kind(char *T){
    //计算种数, 重复出现的不再计算(若多个询问则要在此处加for(i=0->sz)lu[i]=1;
        int j = 0, i, c, temp,ans=0;
        for(i = 0; T[i]; i++){
            c = idx(T[i]);
            while(j && ch[j][c] == 0) j = f[j];
            j = ch[j][c];
            temp = j;
            while(temp && road[temp]){
                if(val[temp])
                {
                    ++ans;
                    val[temp] = 0;
                }
                road[temp] = 0;
                temp = f[temp];
            }
        }
        return ans;
    }
}ac;
int n,v;
char T[100100],P[310];
int main() {
    while(~scanf("%s",T)){
            ac.init();
        scanf("%d",&n);
        while(n--){
            scanf("%s%d",P,&v);
            ac.build(P,v);
        }
        ac.getFail();
        ac.find(T);
    }
}

 

转载于:https://www.cnblogs.com/zsf123/p/4780904.html

内容概要:本文深入探讨了金属氢化物(MH)储氢系统在燃料电池汽车中的应用,通过建立吸收/释放氢气的动态模型和热交换模型,结合实验测试分析了不同反应条件下的性能表现。研究表明,低温环境有利于氢气吸收,高温则促进氢气释放;提高氢气流速和降低储氢材料体积分数能提升系统效率。论文还详细介绍了换热系统结构、动态性能数学模型、吸放氢特性仿真分析、热交换系统优化设计、系统控制策略优化以及工程验证与误差分析。此外,通过三维动态建模、换热结构对比分析、系统级性能优化等手段,进一步验证了金属氢化物储氢系统的关键性能特征,并提出了具体的优化设计方案。 适用人群:从事氢能技术研发的科研人员、工程师及相关领域的研究生。 使用场景及目标:①为储氢罐热管理设计提供理论依据;②推动车载储氢技术的发展;③为金属氢化物储氢系统的工程应用提供量化依据;④优化储氢系统的操作参数和结构设计。 其他说明:该研究不仅通过建模仿真全面验证了论文实验结论,还提出了具体的操作参数优化建议,如吸氢阶段维持25-30°C,氢气流速0.012g/s;放氢阶段快速升温至70-75°C,水速18-20g/min。同时,文章还强调了安全考虑,如最高工作压力限制在5bar以下,温度传感器冗余设计等。未来的研究方向包括多尺度建模、新型换热结构和智能控制等方面。
<think>我们正在处理一个关于单片机项目(智慧闹钟)中期验收的问题。用户询问如何提交或查看中期验收代码。根据提供的引用内容,我们有一些关于数码管显示和温度光照传感器AD转换的代码片段,但并没有直接说明中期验收的提交方式或要求。因此,我们需要根据常见的中期验收流程和项目要求来回答。考虑到这是一个学校项目(湖南大学小学期),通常中期验收可能包括:1.代码提交(可能通过特定的平台,如GitHub、学校内部系统等)2.进度报告(包括已完成的功能和未完成的部分)3.演示(现场演示当前实现的功能)由于没有具体的提交要求被提到,我们可以建议用户: -检查课程公告或任务书-询问助教或老师-查看项目组内的通知另外,我们也可以根据引用代码片段中的功能(数码管显示温度、闹钟开关显示、闹铃音调显示、温度传感器AD转换)来推测可能的中期验收要求:1.完成基本的硬件初始化(数码管、温度传感器、定时器等)2.实现温度采集和显示(包括负温度显示)3.实现闹钟开关和音调设置(并显示)因此,我们可以组织回答如下:首先,回答用户关于中期验收代码提交或要求的问题。然后,根据已有代码片段,我们可以推测中期验收可能需要展示的功能,并建议用户确保这些功能已经实现。最后,生成相关问题。</think>### 中期验收代码提交指南 关于湖南大学STC-B单片机项目中期验收的代码提交要求,根据项目实践惯例和硬件设计实验规范[^1],主要流程如下: #### 1. **提交方式** - 通过学校课程平台(如Moodle或指定Git仓库)提交完整工程文件 - 压缩包命名格式:`学号_姓名_STCB_中期.zip` - 必须包含: ```markdown ├── SourceCode/ # 所有源代码(.c/.h) │ ├── main.c # 主程序入口 │ ├── display.c # 数码管显示模块(含SEG_Display等函数) │ └── sensor.c # 传感器处理模块(含ADC中断配置) ├── Project/ # 单片机工程文件(.uvproj) ├── Documentation/ # 相关文档 │ └── 中期报告.pdf # 含功能完成情况说明 └── README.md # 工程说明文件 ``` #### 2. **验收核心要求** 根据硬件设计实验标准[^1],中期必须实现: 1. **基础显示功能** ```c // 数码管显示示例(引用自示例代码) void SEG_Display() { if(temp<0) { P0=0; weixuan(0); P0=0x40; // 显示负号 } else { P0=0; weixuan(5); P0=segtable[temp_bai]; // 温度百位 } // ...其他位显示 } ``` 2. **传感器数据采集** ```c // ADC中断配置(引用自示例) IE=0xa8; // 启用总中断和ADC中断 TMOD=0x01; // 定时器1模式设置 TH1=(65535-1000)/256; // 定时初值 TR1=1; // 启动定时器 ``` 3. **核心功能完成度**(需在报告中明确说明): - 温度采集与显示 - 闹钟开关状态显示 - 基础定时中断功能 #### 3. **查看已提交代码** - 登录课程平台 → "我的提交" → 选择STC-B项目 - 通过实验室设备现场演示(需预约实验台) > ⚠️ 注意:具体截止日期和评分标准请查阅课程任务书,或联系助教确认最新要求[^1]。 --- ### 相关问题 1. 中期报告中需要包含哪些性能指标? 2. 如何优化数码管显示以减少闪烁? 3. STC-B项目中温度传感器的校准方法有哪些? 4. 定时器中断配置有哪些常见错误需要避免? [^1]: 参考湖南大学单片机硬件设计实验规范及智慧闹钟项目示例代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值