zoukankan      html  css  js  c++  java
  • LA、Remember the Word (字典树, 简单dp)

    传送门

    题意: 给你一个初始串 S,strlen(s) <= 3e5  然后给你 n 个单词。 n <= 4000,  每个单词的长度不超过 100 ;

       问你这个初始串,分割成若干个单词的连接的方案;(这些单词必须是给定的n个单词中的任意一个,一个单词可以被使用多次。)

    解: 将 n 个单词建个字典树;

       dp[ i ] 表示,S的 0 ~ i - 1 切割成若干个 单词的方案数;

       枚举S, 枚举到 当前位置 i; 然后就在字典树找,以 S 的 i + 1 开始的, 能不能找到一个单词与之匹配;

       若能找到, 假设单词为 i + 1 ~ j; 那么就有 dp[ j + 1 ] = ( dp[ j + 1 ] + dp[ i ] ) % mod

        这只是个简单dp; 和字典树的简单应用的结合。 

    #include <bits/stdc++.h>
    #define LL long long
    #define rep(i, j, k) for(int i = j; i <= k; i++)
    #define dep(i, j, k) for(int i = k; i >= j; i--)
    #define INF 0x3f3f3f3f
    #define inf 0x3f3f3f3f3f3f3f3f
    #define mem(i, j) memset(i, j, sizeof(i))
    #define pb push_back
    using namespace std;
    
    const int mod = 20071027;
    
    const int N = 3e5 + 5, M = 4e5 + 5;
    char s[N], b[105];
    int a[M][40], tot, vis[N], dp[N];
    int get(char x) {
        return x - 'a';
    }
    void join() {
        int now = 0;
        rep(i, 0, (int)strlen(b) - 1) {
            int id = get(b[i]);
            if(!a[now][id]) {
                mem(a[tot], 0); vis[tot] = 0;
                a[now][id] = tot++;
            }
            now = a[now][id];
        }
        vis[now] = 1;
    }
    int main() {
        int cas = 0;
        while(~scanf("%s", s)) {
            int n; scanf("%d", &n); tot = 1;
            mem(a[0], 0);
            rep(i, 1, n) {
                scanf("%s", b); join();
            }
            mem(dp, 0); dp[0] = 1;
            rep(i, 0, (int)strlen(s) - 1) {
                int now = 0;
                rep(j, i, (int)strlen(s) - 1) {
                    int id = get(s[j]);
                    if(!a[now][id]) break;
                    now = a[now][id];
                    if(vis[now]) {
                        dp[j + 1] = (dp[j + 1] + dp[i]) % mod;
                    }
                }
            }
            printf("Case %d: ", ++cas);
            printf("%d
    ", dp[(int)strlen(s)]);
        }
        return 0;
    }
    View Code
    一步一步,永不停息
  • 相关阅读:
    Tomcat 中会话超时的相关配置
    Oracle10g任务调度创建步骤
    Oracle的三种高可用集群方案
    软/硬件负载均衡产品 你知多少?
    Nginx、LVS及HAProxy负载均衡软件的优缺点详解
    java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
    TortoiseSVN客户端重新设置用户名和密码
    Linux下oracle数据库启动和关闭操作
    Linux下使用ps命令来查看Oracle相关的进程
    【Kill】两条Linux命令彻底杀死Oracle
  • 原文地址:https://www.cnblogs.com/Willems/p/11980244.html
Copyright © 2011-2022 走看看