[cf] Educational Codeforces Round 57 (Rated for Div. 2) B 组合数学,字符串删除问题

10 篇文章 0 订阅
8 篇文章 0 订阅

前言

t a g : tag : tag:字符串 组合数 *1300
传送门 :

题意

给定一个 字符串, 仅删除一次子串(连续),询问有多少种方法使得最后剩余的串只出现相同的字符

思路

组合数问题,首先我们考虑分类讨论

  • 如果本来的串就是相同的 , 那么我们考虑使用隔板法,对于 n + 1 n+1 n+1个空隙,我们选 2 2 2个空隙删除,即 C n + 1 2 = n ∗ ( n + 1 ) 2 C_{n+1}^2=\frac{n*(n+1)}{2} Cn+12=2n(n+1)
  • 如果头尾一样,则 ( p r e + 1 ) ∗ ( s u l ∗ 1 ) (pre+1)*(sul*1) (pre+1)(sul1),作乘法原理
  • 否则就只能单一的删除 p r e + s u l + 1 pre+sul+1 pre+sul+1

Code

const int mod = 998244353;

void solve(){
	int n;cin>>n;
	string s;cin>>s;
	
	int flag = 0 ;
	
	ll pre =  1 ;
	ll sul =  1 ;
	
	for(int i=1;i<n;i++){
		
		if(s[i]!=s[i-1]){
			flag =  0;
			break;
		}
		
		pre++;
		
	}
	
	if(flag){
		cout<<(n*(n+1)/2)%mod<<endl;
		return;
	}
	
	
	for(int i=n-2;i>0;i -- ){
		if(s[i]!=s[i+1]) break;
		sul ++;
		
	}
	
	if(s[0] == s[n-1])
	cout<<((pre+1)*(sul+1))%mod<<endl;
	else
	cout<<(pre+sul+1)%mod<<endl;
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值