La 3942 字符串+dp】的更多相关文章

题目大意:一个字符串,可以分解成若干英语单词的连接(单词可以重复使用),求有多少种方法? #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; ; ; ; ; ; ; struct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; ;memset(ch[],…
Link: LA 3942 传送门 Solution: 感觉自己字符串不太行啊,要加练一些蓝书上的水题了…… $Trie$+$dp$ 转移方程:$dp[i]=sum\{ dp[i+len(x)+1]\} (x为从第i位开始的字符串的前缀)$ 计算一个字符串前缀的多模式匹配在$Trie$树上跑一遍就行啦! Code: #include <bits/stdc++.h> using namespace std; ,MOD=; bool vis[MAXN]; char s[MAXN],tmp[MAXN…
2121: 字符串游戏 Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删除,如果删除,则将删除后L分裂成的左右两部分合并.举个例子,L='abcdefg' , S={'de'},如果BX选择将'de'从L中删去,则删后的L='abcfg'.现在BX可以进行任意多次操作(删的次数,顺序都随意),他想知道最后L串的最短长度是多少. Input 输入的第…
引用自:onion_cyc 字符串DP一直不是强项...以后没思路的题就想DP和网络流23333333 f[i]表示从i开始的后缀非子序列的最短长度  pos[i][j]表示从i开始的j字符最早出现位置 则有 f[i]=f[pos[i][j]+1]+1   因为1~pos[i][j]这一段只可能出现一次j,后面接一个不是pos[i][j]+1开始的后缀的子序列的字符串,一定也不是i开始的后缀的子序列 初始状态f[n+1]=1 f[n+2]=0 pos[n+1][0..26]=n+1 因为最后一位…
又被“if(a=b)”坑了QAQ...写C++还是得开Warning,这么久了pascal还没改过来咋回事啊QWQ 题目大意就不说了OWO 网上的题解都不怎么看得懂啊...好像写得都很乱?还是我太sb了 f[i][j][k][0]表示A串前i个字符和B串前j个字符能够匹配,并且分成k段,a[i]不选.f[i][j][k][1]同理但a[i]要选. 于是...f[i][j][k][0]=f[i-1][j][k][1]+f[i-1][j][k][0]; if(a[i]==b[j])f[i][j][k…
反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 /* __ __ * ____| |_____| |____ * | | * | __ | * | | * | > <. | * | | * | | * | ... ⌒ ... | * | | * | | * |___ __| * | | * | | Code is far away from bug with the animal protecting * | | 神兽保佑,代码无bug…
3942 - Remember the Word Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a photographic memory and this may not trouble him, Neal gives it to Jiejie. Since Jiejie can't remember number…
https://vjudge.net/problem/UVA-1401 题意 给出S个不同的单词作为字典,还有一个长度最长为3e5的字符串.求有多少种方案可以把这个字符串分解为字典中的单词. 分析 首先强烈吐槽,vjudge上的UVALive 3942怎么都过不了...然而题目一模一样的UVA 1401就稳稳地过了...很玄学. 根据题意可以想到一个dp,dp[i]表示从第i个字符开始的字符串的分解方案.那么dp[i]=dp[i]+dp[i+len(x)],其中单词x为匹配的前缀. 如此,从后开…
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1943 题目大意: 给定一个字符串和给定一个单词集合.问从给定单词集合中选取单词,有多少种选取方法刚好拼接成字符串. 例如: abcd 4 a b cd ab 有两种 a-b-cd ab-cd 这两种情况 解题思路: 因为给定的字符串的长度是3*10^5所以暴力就不能解决问题了…
题目传送门 题意:(训练指南P209) 问长字符串S能由短单词组成的方案数有多少个 分析:书上的做法.递推法,从后往前,保存后缀S[i, len-1]的方案数,那么dp[i] = sum (dp[i+len(s)]).用字典树记录并查询短单词的前缀的长度. #include <bits/stdc++.h> using namespace std; const int L = 3e5 + 5; const int N = 4e3 + 5; const int M = 1e2 + 5; const…
题意:给你一个由s个不同单词组成的字典和一个长字符串L,让你把这个长字符串分解成若干个单词连接(单词是可以重复使用的),求有多少种.(算法入门训练指南-P209) 析:我个去,一看这不是一个DP吗?刚开始交一直是runtime error,找了好久,一直以为是数组开小了,不断增大还是这样,后来发现我用了char类型...下面分析这个题目 应该不难想到这个状态转移方程: d(i) = sum{d(i+len(x))|单词x是s[i...L]的前缀},其中len(x)是长度.d(i)表示从字符i开始…
看题传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1943 给出一个由S个不同单词组成的字典和一个长字符串,把这个字符串分解成若干个单词的连接(单词可以重复使用),有多少种方法?比如有4个单词a .b .cd.ab,则abcd有两种分解方法:a+b+cd和ab+cd 用DP来做的话,设dp[i]表示从i开始的字符串到…
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; ; + ; +; ; struct Trie { int ch[maxnode][_size]; int val[maxnode]; int sz; Trie() { sz = ; memset(ch[], , ])…
F - 巡了南山我巡北山 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 2172 Description 大师兄在取经途中迷上了ACM-ICPC,稍不留神,师傅就被妖怪抓走了. 大师兄并不着急去救师傅,在虐这道简单题: 有两个字符串A和B,每一次可以选择以下操作中的一种,只对字符串A进行操作,用最少的操作使得字符串A与字符串B相等: 在…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092 这个题是poj-3280的简化版,这里只可以增加字符,设 dp[i][j] 为把以i开头j结尾的子串变为回文串的最少次数, if(s[i]==s[j])  dp[i][j]=dp[i+1][j-1]; else dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1; #include <iostream> #include <cstd…
题目链接: 题目 D. Alyona and Strings time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output 问题描述 After returned from forest, Alyona started reading a book. She noticed strings s and t, lengths of which are…
37-回文字符串 内存限制:64MB 时间限制:3000ms 特判: No通过数:88 提交数:177 难度:4 题目描述: 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入描述: 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1…
筱玛的字符串 思路 :dp [ i ] [ j ] [ 3 ] 分别代表到第 i 位时 左括号比右括号多 j ,后面有三个状态 分别表示当前位置 S3的字符 是正在反转的,还是 反转完成的,还是没有反转的, 根据提议要求 反转的只能是一段连续区间,然后转移即可. 注意 反转完成之后 不能再开始一段新的反转过程 . #include<bits/stdc++.h> using namespace std; #define mod 1000000007 #define ll long long #d…
大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$能匹配最多的不相交的$t$. 先不考虑最少替换的限制, 要尽量多的匹配$t$, 可以先预处理出可以匹配的位置, 然后$dp$. 要求最小的话, 每次$dp$转移时可能有多个转移点, 对每个dp值维护一个前缀最小值即可. #include <iostream> #include <iostre…
https://vjudge.net/problem/UVALive-3942 题意: 给出一个由S个不同单词组成的字典和一个长字符串.把这个字符串分解成若干个单词的连接,有多少种方法?比如,有4个单词a.b.cd.ab,则abcd有两种分解方法:a+b+cd和ab+cd. 思路: 建立字典树,查询的时候令d(i)表示从字符i开始的字符串的分解方案数,则d(i)=sum{d(i+len(x))|单词x是S[i..L]的前缀}. #include<iostream> #include<al…
题意: 给S个不同的单词和一个长字符串 问将其分解为若干个单词有多少种方法(单词可重复使用) 解析: dp[i]表示在这个字符串中以某个位置i为起点的 的一段子字符串 则这个子字符串若存在某个前缀恰好是字典里出现的 这里把前缀的长度设为len 则dp[i] = dp[i] + dp[i+len+1] #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #inc…
题目1 : 有序01字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于一个01字符串,你每次可以将一个0修改成1,或者将一个1修改成0.那么,你最少需要修改多少次才能把一个01串 S 变为有序01字符串(有序01字符串是指满足所有0在所有1之前的01串)呢? 输入 第一行是一个整数 T,代表测试数据的组数.(1 ≤ T ≤ 10) 以下T行每行包含一个01串 S .(1 ≤ |S| ≤ 1000) 输出 对于每组测试数据输出最少需要修改的次数. 样例输入…
#1323 : 回文字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串 S ,最少需要几次增删改操作可以把 S 变成一个回文字符串? 一次操作可以在任意位置插入一个字符,或者删除任意一个字符,或者把任意一个字符修改成任意其他字符. 输入 字符串 S.S 的长度不超过100, 只包含'A'-'Z'. 输出 最少的修改次数. 样例输入 ABAD 样例输出 1思路:经典动态规划题目. 假设f(s[1..n])表示把长度为n的字符串s改写成回文串需要的操…
A palindrome partition is the partitioning of a string such that each separate substring is a palindrome. For example, the string "ABACABA" could be partitioned in several different ways, such as {"A","B","A","…
大意: 给定字符串S, 要求维护三个串, 支持在每个串末尾添加或删除字符, 询问S是否能找到三个不相交的子序列等于三个串. 暴力DP, 若不考虑动态维护的话, 可以直接$O(len^3)$处理出最少需要S中前多少位能匹配. 考虑添加删除的话, DP刷表, $O(len^2q)$ #include <iostream> #include <iostream> #include <algorithm> #include <cstdio> #include <…
题解: 比较水的题目 dp[i][j]表示[i...j]最少改变几次变成回文字符串 那么有三种转移 dp[i][j] = dp[i+1][j-1] + s[i] != s[j] dp[i][j] = dp[i+1][j] + 1(删除左边的字符,或者在右边添加一个字符与左边匹配) dp[i][j] = dp[i][j-1] + 1(删除右边的字符,或者在左边添加一个字符与右边匹配) #include <iostream> #include <cstring> #include &l…
题意:给定一个只由左右括号组成的字符串s,问长度为2*n的包含它的合法括号序列方案数,答案对1e9+7取模 1≤n≤100,1≤|s|≤200 思路:暴力预处理出s的每个前缀[0..i]后加左右括号分别能与原序列最长匹配到的位置,这一步也可以用KMP 设dp[i][j][k][l]为当前到第i位,未匹配的左括号数为j,当前最长能匹配到s的前k位,是否存在过全匹配s的方案数 有两种转移,第i+1位填左括号或者右括号 答案即为 simga dp[n<<1][0][i][1] (i=0..len(s…
给出一个长度不超过300000的字符串 S,然后给出 n 个长度不超过100的字符串. 如果字符串可以多次使用,用这 n 个字符串组成 S 的方法数是多少? 比如样例中,abcd = a + b + cd = ab + cd dp[i] 表示用这n个字符串构成,S中从 i ~ len之间的字母构成的子串,的可分解方案数. 如果存在一个位置 x >= i, 且 i~x 之间的字母是一个单词,那么dp[i] = ∑ ( dp[x] ) 但是如果暴力枚举 i ~ x是不是一个单词,必然会TLE.这时我…
题意:有AB两个字符串,用A中连续的K串匹配B全串,问不同的方案总数 n<=1000,m<=200,k<=m 思路:设dp[k,i,j]为用k串 A中前i个字符匹配B中前j个字符的方案总数 首先dp[k,i,j]=0 (a[i]<>b[j]) 然后就是考虑dp[k,i,j]能否从dp[k,i-1,j-1]即前一个连续转移来 dp[k,i,j]=dp[k,i,j]+dp[k,i-1,j-1] 还有就是另起一串 dp[k,i,j]=dp[k-1,1,j-1]+dp[k-1,2,j…
题目链接 一个长度1000的字符串最少划分为几个回文字符串 ----------------------------------------------------------------------------------------------------------------- 想复杂了. 首先N2的时间预处理一下,从i开始长度为len的字符串是否为回文串. dist(i) = MIN(dist(i),dist(j)+1) 如果 j-i 为一个回文串 #include <set> #i…