首页 > 其他分享 >P11030 『DABOI Round 1』Blessings Repeated题解

P11030 『DABOI Round 1』Blessings Repeated题解

时间:2024-09-12 18:15:43浏览次数:9  
标签:10 vert cdot 题解 DABOI 样例 Repeated 矩阵 dp

P11030 『DABOI Round 1』Blessings Repeated题解

【形式化题意】

给定一个正整数 \(k\) 和两个字符串 \(S,T\)。

设字符串 \(s\) 为 \(k\) 个字符串 \(S\) 首尾相接得到的字符串,\(n=\vert s \vert , m=\vert T \vert\)。

设答案集合 \(P=\{ (i_0,i_1,\dots,i_{m-1}) \mid 0\le i_0 < i_1 < \dots < i_{m-1} < n, \forall~0 \le j < m, s_{i_j}=T_j \}\),请求出 \(\vert P \vert \bmod 998244353\)。

输入格式

输入共 \(3\) 行。

第 \(1\) 行 \(1\) 个整数,表示 \(k\)。

第 \(2\) 行 \(1\) 个字符串,表示 \(S\)。

第 \(3\) 行 \(1\) 个字符串,表示 \(T\)。

输出格式

输出共 \(1\) 行 \(1\) 个整数,表示答案。

样例 #1

样例输入 #1

2
stocyhorz
cyh

样例输出 #1

4

样例 #2

样例输入 #2

4
c
ccc

样例输出 #2

4

提示

【样例 1 解释】

将 \(S\) 重复 \(2\) 次得到 \(\texttt{stocyhorzstocyhorz}\)。

答案集合 \(P=\{(3,4,5),(3,4,14),(3,13,14),(12,13,14) \}\),因此 \(\vert P\vert=4\)。


【数据范围】

对于 \(100\%\) 的数据,\(0<k\le10^{18}\),\(0 < \vert S \vert \le 5 \times 10^3\),\(0 < \vert T \vert \le 10\),字符串 \(S,T\) 均由小写英文字母组成。

\(\text{Point}\) \(k\le\) \(\vert S\vert\le\) \(\vert T\vert\le\)
\(1\sim2\) \(10^{18}\) \(5 \times 10^3\) \(1\)
\(3\) \(1\) \(5 \times 10^3\) \(2\)
\(4\sim5\) \(100\) \(5 \times 10 ^3\) \(2\)
\(6\sim7\) \(1\) \(50\) \(4\)
\(8\sim10\) \(10\) \(5 \times 10^3\) \(10\)
\(11\sim20\) \(10^{18}\) \(5 \times 10^3\) \(10\)

赛时想法

想到了做一个 \(dp\) ,但是一上来就把阶段丢掉了,导致把自己绕晕了,大概想的是定义 \(dp[i]\) 为:如果 \(S\) 的当前位置位在 \(T\) 中,那么选完了这一位以后对应的方案数 ,\(i\) 代表 \(T\) 中对应的第 \(i\) 个字符。转移的时候就统计前缀和就行,但这样的想法很容易被 \(hack\) 掉,还是我太菜了,很显然的一个例子是 \(T=aaa\) ,当我们枚举到 \(S\) 中某位是 \(a\) 时,\(dp[2]\) 会从 \(dp[1]\) 进行转移,因此会多统计出来一部分。

正解

重新定义 \(dp[i][j]\) 为考虑完 \(S\) 中前 \(i\) 个后,选完 \(T\) 串中第 \(j\) 个位置的方案数,那么转移方程也十分的明显了。

\[dp[i][j] = \begin{cases} dp[i-1][j] ,& S[i]!=T[j]\\ dp[i-1][j]+dp[i-1][j-1],&S[i]==T[j]\\ \end{cases}\]

发现 \(k\) 的数据范围尤其的大,基本上要么就是推数学结论,要么就是矩阵加速递推,现在 \(dp\) 都写出来了,这下不得不递推了。

核心思想

和普通的矩阵加速不同(很大可能是我刷的题太少了),本题的 \(dp\) 是带条件的,也就是说,在某一个循环内枚举的时候,有可能会有很多个不同的转移矩阵。

但最重要的地方在于,这些转移矩阵的出现是有规律的,如\((A_1 \cdot A_2\cdot...\cdot A_n)\cdot...\cdot(A_1 \cdot A_2\cdot...\cdot A_n)\) 一共有 \(k\) 个这样的循环,那么我们记每一个循环根据结合律得出的转移矩阵是 \(Sup\) ,总的转移矩阵就是 \(Sup^k\) 。

最后在初始 \(dp\) 矩阵右乘上一个 \(Sup^k\) 就好了。

容易犯错的地方

注意 \(dp[0]\) 的初值应该赋为 \(1\) ,不然答案为 \(0\) 了。

然后还有就是,由于每一个循环节内的子转移矩阵是不同的,所以累乘的方式应该根据 \(dp\) 是左乘还是右乘转移矩阵有所变化,比如下面给出的代码是左乘转移矩阵,那么在预处理的时候也应该从左边乘进来,类似于一个栈的结构。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20;
struct Matrix
{
	int n,m;
	int a[N][N];
	Matrix()
	{
		memset(a,0,sizeof(a));
	}
	void reset()
	{
		memset(a,0,sizeof(a));
	}
	void print()
	{
		for(int i=0;i<=n;++i)
		{
			for(int j=0;j<=m;++j)
				printf("%lld ",a[i][j]);
			putchar('\n');
		}
	}
};
Matrix I(int n)
{
	Matrix tmp;
	tmp.n=tmp.m=n;
	for(register int i=0;i<=n;++i)tmp.a[i][i]=1;
	return tmp;
}
const int MOD=998244353;
Matrix operator *(Matrix a,Matrix b)
{
	Matrix tmp;
	tmp.n=a.n,tmp.m=b.m;
	for(register int i=0;i<=a.n;++i)
		for(register int j=0;j<=b.m;j++)
			for(register int k=0;k<=a.m;++k)
				tmp.a[i][j]+=a.a[i][k]*b.a[k][j]%MOD,tmp.a[i][j]%=MOD;					
	return tmp; 
}
inline Matrix power(Matrix a,int b)
{
	Matrix ans=I(a.n);
	while(b)
	{
		if(b&1)ans=ans*a;
		a=a*a;
		b>>=1;
	}
	return ans;
}
int k,n;
char s[50000],t[100];
Matrix Ans,sup;
vector<int> rec[200];
inline void pre()
{
	cin>>k;
	cin>>s>>t;
	n=strlen(t);
	for(int i=0;i<n;++i)rec[t[i]].push_back(i+1);
	sup=I(n);
	Matrix tmp; 
	for(register int i=0;i<strlen(s);++i)
	{
		tmp=I(n);
		for(int j=0;j<rec[s[i]].size();++j)
		{
			int pos=rec[s[i]][j];
			tmp.a[pos][pos-1]=1;
		}
		sup=tmp*sup;
	}
	Ans.n=n,Ans.m=1,Ans.a[0][1]=1;
}
signed main()
{
	pre();
	Ans=power(sup,k)*Ans;
	cout<<Ans.a[n][1];
	return 0;
 } 

标签:10,vert,cdot,题解,DABOI,样例,Repeated,矩阵,dp
From: https://www.cnblogs.com/Hanggoash/p/18410772

相关文章

  • CTS2024 题解
    \(\text{ByDaiRuiChen007}\)D1T1.水镜ProblemLink给定\(a_1\sima_n\),求多少个\([l,r]\)满足存在实数\(L\),将若干个\(a_i\)变成\(2L-a_i\)后\(a_l\sima_r\)严格递增。数据范围:\(n\le10^6\)。考虑钦定\(i-1\)翻转/不翻转,\(i\)翻转/不翻转,容易发现......
  • 【题解】Solution Set - NOIP2024集训Day27 树形 dp
    【题解】SolutionSet-NOIP2024集训Day27树形dphttps://www.becoder.com.cn/contest/5521「HDU4661」MessagePassing「BZOJ3935」Rbtree「ARC101E」RibbonsonTree「AGC034E」CompleteCompress「COCI2014.10」Kamp「SCOI2015」小凸玩密室「AGC008F」Black......
  • LOJ4222 「IOI2024」马赛克上色 题解
    题目描述给定长为\(n\)、下标从零开始的\(01\)序列\(x,y\),保证\(x_0=y_0\)。令\(col_{0,j}=x_j,col_{i,0}=y_i\),对\(\forall1\lei\ltn,1\lej\ltn\),\(col_{i,j}=[col_{i-1,j}=0\andcol_{i,j-1}=0]\)。\(q\)次询问,给定\(u,d,l,r\),求\(\sum_{i=u}^d......
  • Road of the King 题解
    RoadoftheKing题解形成强连通图的必要条件是点\(1\)能在环中,于是考虑\(1\)号点形成的强连通分量\(x\)。这类图论计数题目往往考虑dp,于是我们设\(dp_{i,j,k}\)表示走了\(i\)步,经过了\(j\)个点,\(1\)号点形成的强连通分量\(x\)的大小为\(k\)时的方案数。转移......
  • 洛谷 P11021 [LAOI-6] 区间测速 题解
    题目传送门使用multisetmultiset可以看成一个序列,支持插入一个数或删除一个数,时间复杂度均为\(O(\logn)\),且能始终保证序列中的数是有序的,而且序列中可以存在重复的数(而set容器要求两两不同,且不保证有序)。一个基本事实:速度最大的时刻必然出现在两个相邻点之间。例如从......
  • CF786B 题解
    题意洛谷题面传送门现有一个图,有\(n\)个节点,从节点\(s\)出发,求到\(n\)个点每一个点的最短路。其中,有三种建边方式:建一条从\(u\)到\(v\)的单向边。从节点\(v\)分别向\([l,r]\)的每个结点连一条边。从节点\([l,r]\)向节点\(v\)连边芝士线段树优......
  • Power Designer 连接 PostgreSQL 逆向工程生成pd表结构操作步骤以及过程中出现的问题
    、使用PowerDesigner16.5链接pg数据库1.1、启动PD.选择CreateModel…。 1.2、选择Modeltypes/PhysicalDataModelPhysicalDiagram:选择pgsql直接【ok】  1.3、选择connect在工具栏选择Database-Connect…快捷键:ctrl+shift+N.如下图:  1.4、选择配置连接......
  • 【洛谷 P5076】【深基16.例7】普通二叉树(简化版)题解(多重集合+lower_bound+upper_bound
    【深基16.例7】普通二叉树(简化版)题目描述您需要写一种数据结构,来维护一些数(都是以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数不超过:查询数的排名(排名定义为比当前数小的数的个数。若有多个相同的数,应输出最小的排名)。查询排名为的数。求的前驱(......
  • P6684 题解
    CF1386CP6684cf上时限\(1\)秒,洛谷\(2\)秒。思路维护是否有奇环可用拓展域并查集。暴力复杂度\(O(mq)\)。发现插入容易删除困难,用不删除的莫队,可撤销并查集,复杂度\(O((n+q)\sqrtm\logn)\)。大概要\(5\)秒左右,只能过洛谷上的前\(5\)个子任务。等价对于每个\(r\)......
  • 单词游戏 题解
    四倍经验51nod2875单词游戏acwing1185.单词游戏洛谷SPOJWORDS1-PlayonWords单词PlayonWords我们可以将每一个字母看成一个节点,这样我们就有了一个包含26个节点的图,对于读入的单词,我们将首字母和尾字母对应的节点之间建有向边(中间的字母没什么用就不管了)。此......