首页 > 其他分享 >Strings, Subsequences, Reversed Subsequences, Prefixes

Strings, Subsequences, Reversed Subsequences, Prefixes

时间:2024-08-19 14:26:17浏览次数:5  
标签:vis int Reversed Prefixes ++ num Subsequences dp mod

题目大意

  • 给定两个字符串s和t,求出在s里面有多少个本质不同的子序列,使得该序列的前缀包含t,且该序列的反串也包含t
  • 即 s的子序列=t+x+反t‘

首先要确定是否有,就是判断我的S字符串中有没有包含T字符串

for(l = 0 ; l < n ; l++) {
		if(s[l] == t[num]) num++;
		if(num == m) break;
	}
	if(num < m) {
		cout << 0 << endl;
		return 0;
	}

其次如何求出子序列,因为子序列是可以跳着拿的,不是连续的,所以当出现一个新的字符加入,个数会有原有的x个变成x*2+1个,但如果说当前这个字符出现过了,我出现的个数是要减去我上一次出现该字符时的个数

void f1() {
	for(int i = l + 1 ; i < r ; i++) {
		if(vis[s[i]]) dp[i]=(dp[i-1]*2-dp[vis[s[i]]-1])%mod;
		else dp[i] = (dp[i-1]*2+1)%mod;
		vis[s[i]] = i;
	}
	ans = (dp[r-1]+1)%mod;
}

怎么把重叠部分算出我不太明白希望大佬评论一下

#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
const int mod = 1e9+7;
const int A = 1e6+10;
int n,m,l,r,dp[A],vis[30],ans,p = 7;
string s,t;
void f1() {
	for(int i = l + 1 ; i < r ; i++) {
		if(vis[s[i]]) dp[i]=(dp[i-1]*2-dp[vis[s[i]]-1])%mod;
		else dp[i] = (dp[i-1]*2+1)%mod;
		vis[s[i]] = i;
	}
	ans = (dp[r-1]+1)%mod;
}
void f2(int x) {
	int tx,ty,k;
	tx = ty = 0;
	k = 1;
	for(int i = 0 ; i < m ; i++) {
		tx = (tx * p + t[m - i - 1]) % mod;
		ty = (t[m - i - 1] * k + ty) % mod;
		k = k * p % mod;
		if(tx == ty && i >= x - 1) ans++;
	}
}
signed main() {
	cin >> n >> m >> s >> t;
	int num = 0;
	for(l = 0 ; l < n ; l++) {
		if(s[l] == t[num]) num++;
		if(num == m) break;
	}
	if(num < m) {
		cout << 0 << endl;
		return 0;
	}
	num = 0;
	for(r = n - 1 ; r > l ; r--) {
		if(s[r] == t[num]) num++;
		if(num == m) break;
	}
	if(l < r) f1();
	f2(m-num);
	cout << (ans + mod) % mod << endl;
	return 0;
}

标签:vis,int,Reversed,Prefixes,++,num,Subsequences,dp,mod
From: https://blog.csdn.net/dhwujs/article/details/141323533

相关文章

  • P3131 [USACO16JAN] Subsequences Summing to Sevens S
    传送锚点:[USACO16JAN]SubsequencesSummingtoSevensS-洛谷题目描述FarmerJohn's\(N\)cowsarestandinginarow,astheyhaveatendencytodofromtimetotime.EachcowislabeledwithadistinctintegerIDnumbersoFJcantellthemapart.FJwould......
  • [ABC362E]Count Arithmetic Subsequences
    题目大意给定\(N\)个数字的序列,每个元素为\(a[i]\),问长度为i的数字序列是由多少个子序列构成的?定义数字序列:如果\(a[i]-a[j]==a[k]-a[i]\),则\(a[j],a[i],a[k]\)构成数字序列数据范围\(N\leq80,a_i\leq10^9\)题解一看到这个数据范围,就和\(a[i]\)没关系,肯定是和\(N\)有......
  • 题解:CodeForces 843A Sorting by Subsequences[模拟/排序]
    CodeForces843AA.SortingbySubsequencestimelimitpertest:1secondmemorylimitpertest:256megabytesinputstandardinputoutputstandardoutputYouaregivenasequence\(a_1, a_2, ..., a_n\)consistingofdifferentintegers.Itisrequiredtos......
  • Solution - Atcoder AGC021D Reversed LCS
    考虑到\(\operatorname{LCS}(T,T')\)这个形式实在是不太优美,考虑转化一下形式。感受一下,能够知道\(T\)的最长回文子序列\(|\operatorname{LPS}(T)|=|\operatorname{LCS}(T,T')|\)。具体证明可以见zhihu,本人暂时还没看懂。那么接下来对于单个串的\(\operatorname{LPS......
  • CF1919E Counting Prefixes
    CF1919ECountingPrefixesRating:2600题目大意有一个由-1与1构成的数列\(A\)。告诉你它的前缀和升序排序的数列\(P\)。求有多少个满足方案的数列\(A\)。多组数据,其中\(A\)的长度\(n\)有。\(\sumn\leq5000\)。解题思路首先我们考虑枚举\(s=\sumA\)。我......
  • [491] Non-decreasing Subsequences
    算法助手用户:这个题目有什么好的思路吗?“Givenanintegerarraynums,returnallthedifferentpossiblenon-decreasingsubsequencesofthegivenarraywithatleasttwoelements.Youmayreturntheanswerinanyorder.”我的代码是这样的:/**@lcapp=leetcod......
  • CF1924D Balanced Subsequences 题解
    先判掉\(k>\min(n,m)\)的情况。首先有个明显的计算最长合法括号子序列的贪心方法:初始一个值为\(0\)的计数器,从左到右枚举每个字符,遇到(时将计数器加一,遇到)时如果计数器不为\(0\)就减一然后将答案加一。考虑绘制它的折线图。初始时纵坐标为\(0\),从左到右枚举每个字符......
  • CF1922E Increasing Subsequences
    一个显然的思路就是构造很多互不相关的上升序列。但是这样构造出来的\(n\)是\(O(\log_2^2n)\)量级的,所以需要考虑新做法。假设我们本来有一个上升序列,我们能否往里面插数?如果插入的数前面本来有\(x\)个数,那么它有\(2^x\)的贡献。于是容易想到先写一个最大的上升序列,再二......
  • G. Path Prefixes
    原题链接题解深搜带上\(sum_a\),然后把经过的\(sum_b\)放入栈里,二分查找code#definelllonglong#include<bits/stdc++.h>usingnamespacestd;inlinevoidread(ll&x){ x=0; llflag=1; charc=getchar();while(c<'0'||c>'9......
  • E. Increasing Subsequences__2
    原题链接题解已知对于一个长度为\(n\)的连续+1型上升序列而言,其满足要求的子序列有\(2^n\)个若我们在该序列下标为\(k\)的右边插入一个绝对大于左边,绝对小于右边的数,满足要求的子序列会增加\(2^k\)个由此想到极限构造加二进制,其中最高位的一不用管,其余的每一位生成上升......