这题说的是给了一个长的字符串长度最大300000,又给了4000个单词 单词的长度不超过100.计算这个字符串能组成多少种不同单词的组合,求出方案总数。dp[i]以第i个字符为开始的字符串能有多少种的组成方案,这样每次去比较肯定是会超时的,然后可以用Trie树去优化,这样最多枚举100位种比4000位来得快很多

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string.h>
  4. #include <vector>
  5. using namespace std;
  6. const int maxn = *+;
  7. const int signma_size =;
  8. const int mod = ;
  9. struct Trie{
  10. int ch[maxn][signma_size];
  11. int val[maxn];
  12. int sz;
  13. Trie(){ sz=; memset(ch[],,sizeof(ch[]));}
  14. int idx(char c){ return c-'a'; }
  15. void clear(){ sz=; memset(ch[],,sizeof(ch[])); }
  16. void insert(char *s,int v){
  17. int u=,n=strlen(s);
  18. for(int i=; i<n; ++i){
  19. int c= idx(s[i]);
  20. if(ch[u][c]==){
  21. memset(ch[sz],,sizeof(ch[sz]));
  22. val[sz]=;
  23. ch[u][c]=sz++;
  24. }
  25. u=ch[u][c];
  26. }
  27. val[u]=v;
  28. }
  29. void find(char *s,int n,vector<int> &va)
  30. {
  31. int u=;
  32. for(int i=; i<n; ++i){
  33. int c=idx(s[i]);
  34. if(ch[u][c]==) break;
  35. u=ch[u][c];
  36. if(val[u]!=) va.push_back(val[u]);
  37. }
  38. }
  39. }A;
  40. char text[],str[][];
  41. int Len[],dp[];
  42. int main()
  43. {
  44. int S,cas=;
  45. while(scanf("%s%d",text,&S)==){
  46. A.clear();
  47. int n=strlen(text);
  48. for(int i=; i<=S; i++){
  49. scanf("%s",str[i]);
  50. A.insert(str[i],i);
  51. Len[i]=strlen(str[i]);
  52. }
  53. dp[n]=;
  54. vector<int> Val;
  55. for(int i=n-; i>=; i--){
  56.  
  57. A.find(text+i,n-i,Val);
  58. dp[i]=;
  59. int L=Val.size();
  60. for(int j=; j<L; ++j){
  61. int t=Val[j];
  62. dp[i]=( dp[i] + dp[ i+Len[ t ] ])%mod;
  63. }
  64. Val.clear();
  65. }
  66. printf("Case %d: %d\n",++cas,dp[]);
  67. }
  68. return ;
  69. }

uva1401 dp+Trie的更多相关文章

  1. UVa1401 Remember the Word(DP+Trie树)

    题目给定一个字符串集合有几种方式拼成一个字符串. dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符 ...

  2. UVA1401 Remember the word DP+Trie

    问题描述 洛谷(有翻译) 题解 DP,设\(opt_i\)代表前\(i\)个字符方案数. Trie优化,刷表法. \(\mathrm{Code}\) #include<bits/stdc++.h ...

  3. Codeforces 615C Running Track(DP + Trie树)

    题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串. UVa1401,一个道理..dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移. ...

  4. Codeforces 633C Spy Syndrome 2(DP + Trie树)

    题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格.现在给几个已知的单词,还原加密的字符串. 和UVa1401一个道理.. 用dp[i]表示加密字符前i个字符 ...

  5. uva 1401 dp+Trie

    http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. UVA - 1401 | LA 3942 - Remember the Word(dp+trie)

    https://vjudge.net/problem/UVA-1401 题意 给出S个不同的单词作为字典,还有一个长度最长为3e5的字符串.求有多少种方案可以把这个字符串分解为字典中的单词. 分析 首 ...

  7. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. BZOJ 1212: [HNOI2004]L语言( dp + trie )

    因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...

  9. Remember the Word UVALive - 3942(dp+trie)

    题意: 给S个不同的单词和一个长字符串 问将其分解为若干个单词有多少种方法(单词可重复使用) 解析: dp[i]表示在这个字符串中以某个位置i为起点的 的一段子字符串 则这个子字符串若存在某个前缀恰好 ...

随机推荐

  1. centos 安装 phalcon

    git clone --depth 1 --branch phalcon-v2.0.3 https://github.com/phalcon/cphalcon.git cd cphalcon/ext ...

  2. RF使用的相关库API

    RF内置库: http://robotframework.org/robotframework/ SSHLibrary:   ---WEB自动化测试 http://robotframework.org ...

  3. osgEarth使用没有DX的Triton库Triton-MT-DLL-NODX.lib

    将Triton-MT-DLL修改为Triton-MT-DLL-NODX

  4. mac 类似Xshell

    ssh -t root@12.23.34.45 -p 22 ssh -t 用户名@IP地址 -p 端口

  5. 【转】Go Channels

    转自: http://kdf5000.com/2017/07/16/Go-Channels/ Golang使用Groutine和channels实现了CSP(Communicating Sequent ...

  6. EF更新的时候出错

    错误提示: 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectStateManager 项. 说明: 执行当前 Web 请求期间,出现未经处理的异常. ...

  7. Android 跨进程调用忽略权限

    Framework层: @Override    public StackInfo getStackInfo(int stackId) {        final int callingUid = ...

  8. 安装php环境xampp

    1.下载xampp 安装 2.如果启动时发生端口占用错误, 是443和80端口被占用, 可以改成444,88端口, 在C:\xampp\apache\conf\extra\httpd-ssl.conf ...

  9. OA之框架的搭建

    1.使用框架可以有效的解决耦合性过高的问题,减少代码修改的程度,同时方便添加新的功能.首先创建出基本的几个类库.这个框架就是使用基本的逻辑分层三层架构,然后进一步再使用接口对每个逻辑中的类库调用进行解 ...

  10. Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)

    Oracle Schema Objects Oracle Schema Objects——Tables——Oracle Data Types Oracle伪列 在Oracle数据库之中为了实现完整的关 ...