uva1401 dp+Trie
这题说的是给了一个长的字符串长度最大300000,又给了4000个单词 单词的长度不超过100.计算这个字符串能组成多少种不同单词的组合,求出方案总数。dp[i]以第i个字符为开始的字符串能有多少种的组成方案,这样每次去比较肯定是会超时的,然后可以用Trie树去优化,这样最多枚举100位种比4000位来得快很多
- #include <iostream>
- #include <cstdio>
- #include <string.h>
- #include <vector>
- using namespace std;
- const int maxn = *+;
- const int signma_size =;
- const int mod = ;
- struct Trie{
- int ch[maxn][signma_size];
- int val[maxn];
- int sz;
- Trie(){ sz=; memset(ch[],,sizeof(ch[]));}
- int idx(char c){ return c-'a'; }
- void clear(){ sz=; memset(ch[],,sizeof(ch[])); }
- void insert(char *s,int v){
- int u=,n=strlen(s);
- for(int i=; i<n; ++i){
- int c= idx(s[i]);
- if(ch[u][c]==){
- memset(ch[sz],,sizeof(ch[sz]));
- val[sz]=;
- ch[u][c]=sz++;
- }
- u=ch[u][c];
- }
- val[u]=v;
- }
- void find(char *s,int n,vector<int> &va)
- {
- int u=;
- for(int i=; i<n; ++i){
- int c=idx(s[i]);
- if(ch[u][c]==) break;
- u=ch[u][c];
- if(val[u]!=) va.push_back(val[u]);
- }
- }
- }A;
- char text[],str[][];
- int Len[],dp[];
- int main()
- {
- int S,cas=;
- while(scanf("%s%d",text,&S)==){
- A.clear();
- int n=strlen(text);
- for(int i=; i<=S; i++){
- scanf("%s",str[i]);
- A.insert(str[i],i);
- Len[i]=strlen(str[i]);
- }
- dp[n]=;
- vector<int> Val;
- for(int i=n-; i>=; i--){
- A.find(text+i,n-i,Val);
- dp[i]=;
- int L=Val.size();
- for(int j=; j<L; ++j){
- int t=Val[j];
- dp[i]=( dp[i] + dp[ i+Len[ t ] ])%mod;
- }
- Val.clear();
- }
- printf("Case %d: %d\n",++cas,dp[]);
- }
- return ;
- }
uva1401 dp+Trie的更多相关文章
- UVa1401 Remember the Word(DP+Trie树)
题目给定一个字符串集合有几种方式拼成一个字符串. dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符 ...
- UVA1401 Remember the word DP+Trie
问题描述 洛谷(有翻译) 题解 DP,设\(opt_i\)代表前\(i\)个字符方案数. Trie优化,刷表法. \(\mathrm{Code}\) #include<bits/stdc++.h ...
- Codeforces 615C Running Track(DP + Trie树)
题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串. UVa1401,一个道理..dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移. ...
- Codeforces 633C Spy Syndrome 2(DP + Trie树)
题目大概说给一个加密的字符串,加密规则是把原文转化成小写字母,然后各个单词反转,最后去掉空格.现在给几个已知的单词,还原加密的字符串. 和UVa1401一个道理.. 用dp[i]表示加密字符前i个字符 ...
- uva 1401 dp+Trie
http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA - 1401 | LA 3942 - Remember the Word(dp+trie)
https://vjudge.net/problem/UVA-1401 题意 给出S个不同的单词作为字典,还有一个长度最长为3e5的字符串.求有多少种方案可以把这个字符串分解为字典中的单词. 分析 首 ...
- 二分+DP+Trie HDOJ 5715 XOR 游戏
题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- BZOJ 1212: [HNOI2004]L语言( dp + trie )
因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...
- Remember the Word UVALive - 3942(dp+trie)
题意: 给S个不同的单词和一个长字符串 问将其分解为若干个单词有多少种方法(单词可重复使用) 解析: dp[i]表示在这个字符串中以某个位置i为起点的 的一段子字符串 则这个子字符串若存在某个前缀恰好 ...
随机推荐
- centos 安装 phalcon
git clone --depth 1 --branch phalcon-v2.0.3 https://github.com/phalcon/cphalcon.git cd cphalcon/ext ...
- RF使用的相关库API
RF内置库: http://robotframework.org/robotframework/ SSHLibrary: ---WEB自动化测试 http://robotframework.org ...
- osgEarth使用没有DX的Triton库Triton-MT-DLL-NODX.lib
将Triton-MT-DLL修改为Triton-MT-DLL-NODX
- mac 类似Xshell
ssh -t root@12.23.34.45 -p 22 ssh -t 用户名@IP地址 -p 端口
- 【转】Go Channels
转自: http://kdf5000.com/2017/07/16/Go-Channels/ Golang使用Groutine和channels实现了CSP(Communicating Sequent ...
- EF更新的时候出错
错误提示: 存储区更新.插入或删除语句影响到了意外的行数(0).实体在加载后可能被修改或删除.刷新 ObjectStateManager 项. 说明: 执行当前 Web 请求期间,出现未经处理的异常. ...
- Android 跨进程调用忽略权限
Framework层: @Override public StackInfo getStackInfo(int stackId) { final int callingUid = ...
- 安装php环境xampp
1.下载xampp 安装 2.如果启动时发生端口占用错误, 是443和80端口被占用, 可以改成444,88端口, 在C:\xampp\apache\conf\extra\httpd-ssl.conf ...
- OA之框架的搭建
1.使用框架可以有效的解决耦合性过高的问题,减少代码修改的程度,同时方便添加新的功能.首先创建出基本的几个类库.这个框架就是使用基本的逻辑分层三层架构,然后进一步再使用接口对每个逻辑中的类库调用进行解 ...
- Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)
Oracle Schema Objects Oracle Schema Objects——Tables——Oracle Data Types Oracle伪列 在Oracle数据库之中为了实现完整的关 ...