Remember the Word UVA - 1401(Trie+DP)

题目

蓝书上的一道题, 给出一个长的字符串后给出n个短的字符串,问将短的字符串组合成长的字符串有多少种组合。
就比如:a, b, cd, ad可以组成abcd的四种方式:a+b+cd, ab+cd。

思路

先用短的字符串构建成Trie树,也就是短的字符串的集合。
令d(i)表示从字符i开始的字符串( 即后缀s[i….n] )的分解方案数。
则d(i) = sum{ d(i+len(x)) | 单词x是s[i….n]的前缀 }

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 300000 + 10, mod = 20071027;
char s[maxn];
char p[4010];
int n;
int sz;
int ch[maxn][26], val[maxn];
int d[maxn];

int idx(char c) { return c - 'a'; }

void insert(){
    int u = 0, len = (int)strlen(p);
    for(int i=0;i<len;i++){
        int c = idx(p[i]);
        if(!ch[u][c]) {
            memset(ch[sz], 0, sizeof(ch[sz]));
            ch[u][c]=sz++;
        }
        u = ch[u][c];
    }
    val[u]=1;  // 标记结束
}

void init(){
    int m;
    n = (int)strlen(s);
    sz=1;
    memset(val, 0, sizeof(val));
    memset(ch[0], 0, sizeof(ch));
    scanf("%d", &m);
    while(m--) {
        scanf("%s", p);
        insert();
    }
}
void find(int id) {
    int u=0;
    d[id]=0;
    for(int i = id; i < n; i++) {
        int c=idx(s[i]);
        if(!ch[u][c]) return;
        u = ch[u][c];
        if(val[u]) {
            d[id]=(d[id]+d[i+1])%mod;
        }
    }
}

void solve(){
    d[n]=1;
    for(int i=n-1;i>=0;i--){
        find(i);
    }
    cout << d[0] << endl;
}

int main(){
    //freopen("input.txt", "r", stdin);
    int kase=0;
    while(~scanf("%s", s)) {
        init();
        printf("Case %d: ", ++kase);
        solve();
    }

    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值