`
阿尔萨斯
  • 浏览: 4332856 次
社区版块
存档分类
最新评论

uva 1401 - Remember the Word(字典树+dp)

 
阅读更多

题目链接:uva 1401 - Remember the Word

题目大意:给出一个由S个不同单词组成的字典和一个长字符串。吧这个字符串分解成若干个单词的连接,有多少种方法。

解题思路:dp(i) = sum{ dp(i+len(x))}, 单词x为S[i...L]的前缀。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 105;
const int MOD = 20071027;
const int maxnode = 300000;
const int sigma_size = 30;

struct Trie {
    int sz;
    int val[maxnode];
    int next[maxnode][sigma_size];

    Trie () { clear(); }

    int idx (char ch) {    return ch - 'a'; }
    void clear();
    void insert (char *s, int v);
    bool query (char *s);
}tree;

int dp[maxnode];
char word[maxn], str[maxnode];

void init () {
    int n;
    tree.clear();

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%s", word);
        tree.insert(word, 1);
    }
}

void solve (int x) {
    int u;
    int& ans = dp[x];
    ans = u = 0;

    for (int i = x; str[i]; i++) {
        int v = str[i] - 'a';

        if (tree.next[u][v] == 0)
            return;
        u = tree.next[u][v];
        if (tree.val[u])
            ans = (ans + dp[i+1]) % MOD;
    }
}

int main () {
    int cas = 1;
    while (scanf("%s", str) == 1) {
        init();
        int n = strlen(str);
        dp[n] = 1;
        for (int i = n-1; i >= 0; i--)
            solve(i);
        printf("Case %d: %d\n", cas++, dp[0]);
    }
    return 0;
}

void Trie::clear () {
    sz = 1;
    memset(next[0], 0, sizeof(next[0]));
}

void Trie::insert (char* s, int v) {
    int u = 0, n = strlen(s);
    for (int i = 0; i < n; i++) {
        int c = idx(s[i]);

        if (next[u][c] == 0) {
            val[sz] = 0;
            memset(next[sz], 0, sizeof(next[sz]));
            next[u][c] = sz++;
        }
        u = next[u][c];
    }
    val[u] = v;
}

bool Trie::query (char* s) {
    int u = 0, n = strlen(s);
    for (int i = 0; i < n; i++) {
        int c = idx(s[i]);

        if (next[u][c] == 0)
            return false;
        u = next[u][c];
    }
    return val[u];
}
分享到:
评论

相关推荐

    UVa-writeup:使用C ++编写UVa

    在本篇中,我们将深入探讨如何使用C++编程语言来解决UVa(University of Virginia Online Judge)上的问题。UVa在线判题系统是程序员和计算机科学爱好者用来练习和提高算法能力的一个平台,它包含了各种难度级别的...

    Uva 1510 - Neon Sign

    ### Uva 1510 - Neon Sign #### 问题背景与描述 在题目“Uva 1510 - Neon Sign”中,我们面对的是一个霓虹灯招牌设计问题。该霓虹灯招牌由一系列位于圆周上的角点组成,并通过发光管连接这些角点。发光管有两种...

    UVaOJ-401(Palindromes).zip_401 Palindromes

    标题中的"UVaOJ-401(Palindromes)"表明这是一个关于解决UVa Online Judge(UVa OJ)上编号为401的编程挑战,该挑战的主题是"Palindromes",即回文串。回文串是指一个字符串无论从前读到后还是从后读到前都是相同的,...

    CPP中的Postfix-Tree-Calculator:在C ++中实现后缀树计算器。 包括来自UVA CS部门的测试C ++文件

    后缀树计算器是一种基于后缀表达式的计算方法,它利用了树形结构来高效地解析和计算数学表达式。在C++中实现这样的计算器涉及到数据结构、算法以及编译原理的相关知识。本项目中,开发者可能使用了栈作为辅助数据...

    uva705-Slash-Maze-.rar_Slash_uva705

    【标题】"uva705-Slash-Maze-.rar_Slash_uva705" 指向的是一个在UVa Online Judge (UVa OJ) 上提交并通过的编程问题,具体为问题编号705,名为"Slash Maze"。这个压缩包很可能包含了该问题的解决方案源代码。 ...

    UVA100~200---52道题accept代码,均顺利accept过

    这些文件名代表的是在UVA(University of Virginia)在线判题系统上解决的编程题目,主要是C++语言编写的解决方案。UVA是一个知名的在线编程竞赛平台,它提供了大量的算法问题供程序员挑战,有助于提高编程技能和...

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip,两年来每天都在解决一个uva在线裁判问题,算起来…

    Uva 100(The 3n+1 problem) c 代码

    Uva 100 ,问题是The 3n+1 probelm ,可以ac的代码

    UVA133-TheDoleQueue.zip_site:www.pudn.com_uva133

    《UVA133 - 救济金发放问题:The Dole Queue》 在计算机科学领域,算法是解决问题的关键工具,特别是在处理复杂数据结构和优化问题时。UVA(University of Virginia)在线判题系统提供了丰富的算法题目供程序员挑战...

Global site tag (gtag.js) - Google Analytics