LINK:[Lydsy1710月赛]小A的咒语

每次给定两个串 要求从a串中选出x段拼成B串 能否做到。T组数据。

\(n\leq 100000,m\leq 100000,T\leq 10,x\leq 100\)

首先考虑贪心的从前往后匹配 若果当前匹配位置比之前还要远覆盖之前的 但是这样做会出现问题。

可能当前匹配的是之前匹配的后面的一段 也可能是之前的一段。

所以需要dp来解决这个后效性问题 设g[i][j]表示前i段个字符选出了j段所能拼成B串的最大长度。

有g[i][j]=g[i-1][j] 考虑匹配的时候 从i+1 和g[i][j]+1进行匹配。

为什么要这样做考虑g数组值小一点显然当前大一点的g数组比小一点的要优 给后面带来的结果不会更差。

由于第二维状态的存在也解决了上述 到底是匹配之前的还是匹配之后的问题。

考虑转移 枚举K 进行转移 f[i+k][j+1]=f[i][j]+k; 考虑这里的k取到最大值的时候对后面结果不会更差。

注意这里只能采用刷表法 因为填表的话还是不知道K是多少。

多组数据 注意清空。

const int MAXN=400010;
int n,k,m,ww,L,R,w1,w2;
int x[MAXN],y[MAXN],sa[MAXN],rk[MAXN],h[MAXN],c[MAXN];
int f[MAXN][21],Log[MAXN],g[100010][103];
char a[MAXN];
inline void SA()
{
m=150;
rep(1,m,i)c[i]=0;
rep(1,n,i)++c[x[i]=a[i]];
rep(1,m,i)c[i]+=c[i-1];
rep(1,n,i)sa[c[x[i]]--]=i;
for(int k=1;k<=n;k=k<<1)
{
int num=0;
rep(n-k+1,n,i)y[++num]=i;
rep(1,n,i)if(sa[i]>k)y[++num]=sa[i]-k;
rep(1,m,i)c[i]=0;
rep(1,n,i)++c[x[i]];
rep(1,m,i)c[i]+=c[i-1];
fep(n,1,i)sa[c[x[y[i]]]--]=y[i];
rep(1,n,i)y[i]=x[i],x[i]=0;
x[sa[1]]=num=1;
rep(2,n,i)x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?num:++num;
if(n==num)break;
m=num;
}
rep(1,n,i)rk[sa[i]]=i;
}
inline void get_height()
{
int k=0;
rep(1,n,i)
{
if(rk[i]==1)continue;
if(k)--k;
int j=sa[rk[i]-1];
while(a[i+k]==a[j+k])++k;
h[rk[i]]=k;
}
rep(2,n,i)
{
f[i-1][0]=h[i];
Log[i]=Log[i>>1]+1;
}
rep(1,Log[n-1],j)
rep(1,n-1-(1<<j)+1,i)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
inline int LCP(int x,int y)
{
if(x>w1||y>w2)return 0;
x=rk[x];y=rk[y+w1+1];
if(x>y)swap(x,y);--y;
int z=Log[y-x+1];
return min(f[x][z],f[y-(1<<z)+1][z]);
}
int main()
{
freopen("1.in","r",stdin);
int T;get(T);
rep(2,300000,i)Log[i]=Log[i>>1]+1;
while(T--)
{
get(w1);get(w2);int get(cc);
gc(a);gc(a+w1+1);
a[w1+1]='z'+1;a[w1+w2+2]='z'+2;
n=w1+w2+1;
SA();get_height();
memset(g,0,sizeof(g));
rep(0,w1,i)
{
rep(0,cc,j)
{
if(i>=1)g[i][j]=max(g[i-1][j],g[i][j]);
int ww=LCP(i+1,g[i][j]+1);
if(i+ww<=w1)g[i+ww][j+1]=max(g[i][j]+ww,g[i+ww][j+1]);
//cout<<g[i+ww][j+1]<<endl;
}
}
if(g[w1][cc]>=w2){puts("YES");}
else puts("NO");
}
return 0;
}

5073 [Lydsy1710月赛]小A的咒语的更多相关文章

  1. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  2. [BZOJ5073][Lydsy1710月赛]小A的咒语

    bzoj description 你有一个\(A\)串和\(B\)串,你需要判断是否可以在\(A\)串中拆出\(x\)个互不相交的子串,使它们按顺序拼在一起可以组成\(B\)串. \(|A|,|B|\ ...

  3. [BZOJ5073] [Lydsy1710月赛]小A的咒语 后缀数组+dp+贪心

    题目链接 首先这种题一看就是dp. 设\(dp[i][j]\)表示\(A\)序列中到\(i\)位之前,取了\(j\)段,在\(B\)中的最长的长度. 转移也比较简单 \[ dp[i][j] \to d ...

  4. 【BZOJ5073】[Lydsy十月月赛]小A的咒语 DP(错解)

    [BZOJ5073][Lydsy十月月赛]小A的咒语 题解:沙茶DP,完全不用后缀数组. 用f[i][j]表示用了A的前i个字符,用了j段,最远能匹配到哪.因为显然我们能匹配到的地方越远越好,所以我们 ...

  5. [BZOJ 5072][Lydsy1710月赛]小A的树

    传送门 \(\color{green}{solution}\) 嗯...其实我也不太会,所以大胆猜个结论吧(后来证了一下,然后放弃了...). 我们发现如果要使一个联通块的黑点数量为\(k\)的方案最 ...

  6. BZOJ5072:[Lydsy1710月赛]小A的树(树形DP)

    Description BZOJ只是扔了个下载链接 Solution 设$f[x][i]$表示$x$点选中$i$个黑点的最小连通块. 设$g[x][i]$表示$x$点选中$i$个黑点的最大连通块. 转 ...

  7. [BZOJ 5074][Lydsy1710月赛]小B的数字

    传送门 \(\color{green}{solution}\) 设 \[b_{i}=2^{w_{i}},sum= \sum_{i=1}^{n}{w_{i}}\] 则对于任意\(a_{i}\)都有 \[ ...

  8. [Lydsy1710月赛] 小B的数字

    神TM 又又又又是构造题..... 很简单的化简就是,把2^k[i]都换成k[i] ,然后就可以得出 对于任意的i,k[i] * a[i] >= ∑k[]. 最优的构造肯定是使  k[i] = ...

  9. bzoj 5072 [Lydsy1710月赛]小A的树——树形dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 发现对于每个子树,黑点个数确定时,连通块的大小取值范围一定是一段区间:所以考虑只最小化 ...

随机推荐

  1. 切忌一步到位,谈谈DevOps实施落地

    2020年6月19日,由云计算开源产业联盟指导,高效运维社区和 DevOps 时代社区联合举办的GNSEC 2020线上峰会圆满举办.BoCloud博云参加了本次峰会并分享了博云帮助客户实施DevOp ...

  2. Fetch.ai的突破使急速闪电共识成为现实

    Jonathan Ward 区块链的终结问题是由于技术限制,它已经成为区块链技术被广泛采用的障碍.用外行的话来说,终结时间可以看作是事务首次提交到网络并被确认为有效之间的等待时间.为了成功地革新我们的 ...

  3. Tomcat双击startup.bat闪退的原因及解决方式

    很久不碰Tomcat了,最近因为种种原因需要重新投入到Java Web的怀抱,所以又重新接触了Tomcat 我下载了tomcat的压缩包将其解压缩到某个位置,我这里是D盘下的tomcat文件夹中,但是 ...

  4. bzoj4396[Usaco2015 dec]High Card Wins*

    bzoj4396[Usaco2015 dec]High Card Wins 题意: 一共有2n张牌,Alice有n张,Bob有n张,每一局点数大的赢.知道Bob的出牌顺序,求Alice最多能赢几局.n ...

  5. java 使用正则去重

    //去重复 public static void test1() { String str = "aaactttsssfvvvvds"; String regex = " ...

  6. 树形dp 之 小胖守皇宫

    题目描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:有边相连的宫殿间可以互相望见.大内保卫森严,三步一岗,五步一 ...

  7. 设计模式:decorator模式

    两点: 继承同一虚接口,实现数据一致性 桥接方式指向被装饰类 目的:在不改变被装饰类功能的前提下增加新功能 特点:继承是子类和父类强耦合,桥接是低耦合 例子: class Print //抽象接口 { ...

  8. 设计模式:abstract factory模式

    含义:抽象工厂将“抽象零件”组装成“抽象产品” 理解:相比于工厂方法模式,可以根据不同的接口创建不同的产品,说白了就是将一个接口变成两个接口,各自返回不同的抽象产品 例子: class Car //抽 ...

  9. C++语法小记---一个有趣的现象

    下面的代码会飞吗? #include <iostream> #include <string> using namespace std; class Test { public ...

  10. 47 张图带你 MySQL 进阶!!!

    我们在 MySQL 入门篇主要介绍了基本的 SQL 命令.数据类型和函数,在局部以上知识后,你就可以进行 MySQL 的开发工作了,但是如果要成为一个合格的开发人员,你还要具备一些更高级的技能,下面我 ...