首页 > 其他分享 >题解:CF176B Word Cut

题解:CF176B Word Cut

时间:2024-12-03 17:15:55浏览次数:4  
标签:子串 cnt Cut Word int 题解 ++ 操作

https://www.luogu.com.cn/problem/CF176B


没看懂其他题解为什么说 "可以发现,只要能从一个串变成一个串,都可以通过仅一次变换得到"。

转化

将题目中的操作转化一下:对于一个串 \(s\),将串 \(s\) 复制一份接到 \(s\) 末尾,然后选择一段长度 \(n \) 的子串。

发现:经过一次操作后,接下来的操作任然是 在原 \(s\) 复制后的串中选择一个长度 \(n\) 的子串。

如图:

第一个字符串中红色区间表示选择的子串。原 \(s\) 复制后的串,不妨将其分为四段 \(s_1+s_2+s_1+s_2\)。

第一次操作后得到的串 \(t\),发现其任然可以分为四段 \(s_2+s_1+s_2+s_1\)。

容易看出在 \(t\) 中选择一个长度为 \(n\) 的子串等价于在 \(s\) 中选择一个长度为 \(n\) 的子串。

所以:题目中的 \(a\) 通过多次操作得到的串,这个串通过一步变为 \(b\) 的操作种类数,是固定的,我们不妨直接求出 \(a\) 可以通过几种操作得到 \(b\),记为 \(cnt\)。

解法

\(cnt\) 可以直接求。

然后考虑 dp。\(f_{i,0/1}\) 表示经过 \(i\) 次操作,当前字符串是 原串 还是 非原串,的操作种类数。

具体转移可以去看其他题解,例如这位大佬的:https://www.luogu.com.cn/article/84ns8qcl

Code

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const LL mod = 1e9 + 7;
const int MAXK = 1e5 + 3;

string a, b;
int k, cnt = 0;
LL f[MAXK][2];

int main(){
	cin >> a >> b >> k;
	if(a == b) cnt++;
	for(int i = 0; i < a.size() - 1; i++){
		string t = a.substr(i + 1, a.size()-i-1) + a.substr(0, i+1);
		if(t == b) cnt++;
	}
	f[0][(a == b ? 0 : 1)] = 1;
	for(int i = 1; i <= k; i++){
		f[i][0] = 1ll * cnt * f[i - 1][1] % mod + 1ll * (cnt - 1) * f[i - 1][0] % mod;
		f[i][0] %= mod;

		f[i][1] = 1ll * (a.size() - cnt) * f[i - 1][0] + 1ll * (a.size() - cnt - 1) * f[i - 1][1] % mod;
		f[i][1] %= mod;
	}
	cout << f[k][0];
	return 0;
}

标签:子串,cnt,Cut,Word,int,题解,++,操作
From: https://www.cnblogs.com/huangqixuan/p/18584519

相关文章

  • 题解:AT_abc138_f [ABC138F] Coincidence
    https://www.luogu.com.cn/problem/AT_abc138_f对于\(x\ley\):若\(2x\ley\),则\(y-x>y\bmodx\)。若\(2x>y\),则\(y-x=y\bmodx\)。有\(x\oplusy\gey-x\)。当\(2x\ley\)时,不可能存在\(y\bmodx=x\oplusy\)了。现......
  • 题解:AT_abc372_f [ABC372F] Teleporting Takahashi 2
    https://www.luogu.com.cn/problem/AT_abc372_f简单易懂易写。考虑一步一步走。要么顺着环走,要么走那\(m\)条边。设\(id(k,i)=(i-1-k)\bmodn+1\)。设\(g_{k,id(k,i)}\)表示走了\(k\)步走到\(i\)的方案数。这样设计下标就不需要管顺着环走了。顺着环走......
  • 题解:CF843D Dynamic Shortest Path
    https://www.luogu.com.cn/problem/CF843DluoguRMJ加油.......如果每修改一次就dij复杂度\(O(q(n+m\logn))\)过不去的。暴力dij是因为值域很大需要用到堆,带个log,要是值域很小就可以直接分层BFS了……每次增加的边权很小,求最短路增量?设\(dis_i\)表示这次修......
  • 题解:AT_abc356_f [ABC356F] Distance Component Size Query
    https://www.luogu.com.cn/problem/AT_abc356_f前言纪念我场上WA8发没调出来,最后发现是1e18的问题。题目传送门:[ABC356F]DistanceComponentSizeQuery。不会线段树分治怎么办???那就用set+01-trie。思路一个联通块内的元素在值域上也是连续的,考虑维护一个联通快内......
  • 题解:CF1827C Palindrome Partition
    CF1827CPalindromePartition题解题面题目传送门。称一个字符串是好的,当且仅当它是一个长度为偶数的回文串或由若干长度为偶数的回文串拼接而成。给定一个长度为\(n\)的字符串\(s\),求有多少\(s\)的子串是好的。$1\len\le5\cdot10^5\(,\)s$仅包含小写字母。与......
  • 题解:CF1968G2 Division + LCP (hard version)
    https://www.luogu.com.cn/problem/CF1968G2CF1968G2Division+LCP(hardversion)题解前言这题可以\(O(n\sqrt{n}\logn)\)再各种优化做,算法是二分、哈希(不知道包不包含根号分治,但是有用到根号分治的思想)。如果读题解有些抽象的话可以看代码辅助理解。题意转化由于......
  • 题解:P10217 [省选联考 2024] 季风
    P10217[省选联考2024]季风题解题目传送门。初步化简题目注:本篇题解的所有下标均从\(1\)开始。设\(sumx_h\)表示\(\sum_{i=1}^{h}{x_i}\),\(sumy_i\)表示\(\sum_{i=1}^{h}{y_i}\)。于是题目给出的三个公式可以转化为:\((\sum_{i=1}^{m}{x_{i}^{′}})+sumx_{[(m-1......
  • 题解:AT_abc282_h [ABC282Ex] Min + Sum
    [ABC282Ex]Min+Sum题解题面传送门。题目要求有多少对\((l,r)\)满足\(1\lel\ler\len\)且\(\sum_{i=l}^{r}{b_i}+\min_{i=l}^{r}{a_i}\leS\)。考虑CDQ分治,那么我们需要不断寻找有多少对\((l,r)\)满足\(L\lel\leM<r\leR\)且\(\sum_{i=l}^{r}{b......
  • Create Stunning Word Clouds with Ease!
    >Lookingtocraftbreathtakingwordclouds?WordCloudStudioisyourgo-tosolution!Whetheryou’reamarketer,educator,designer,orsimplysomeonewholovesvisualizingdata,thisapphaseverythingyouneed.Downloadnow:https://apps.apple.com/app......
  • 下载 WordCloudStudio,一键制作美观词云!
    轻松创建令人惊叹的词云图,适合多个场景应用!无论您是教育者、数据分析师,还是营销达人,WordCloudStudio都能满足您的需求,让您的创意触手可及!功能亮点• AI定制模板:输入需求,AI智能生成专属模板。• 海量模板库:超过11000个高质量模板供您选择,且数量持续更新中。• 动态Gif/视频......