CF1096B Substring Removal(字符串模拟)思维

博客介绍了字母组合的三种情况,包括所有字母都一样、头尾字母一样中间有不一样、头尾不一样。还说明了判断所有字母是否一样用flag,以及不同情况下的计算原理,头尾一样用乘法原理,不一样用加法原理,最后提到要进行MOD操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

只要分三种情况:

所有字母都一样 头尾字母一样,中间有不一样的 头尾不一样 flagflag是用来判断是否所有都一样的(TrueTrue为一样
FalseFalse为不一样)

如果头尾一样,乘法原理:(头+1)×(尾+1)(加一是因为可以全部去掉)

如果不一样,加法原理:头+尾+1 ,要么全去头,要么全去尾,(可以空串再加一)

最后边忘了MODMOD

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int MOD=998244353;
ll n;
string str;

int main(){
    cin >> n ;
    cin >> str;
    bool flag = 1;
    ll c1 = 1, c2 = 1;
    //记录前面相同个数
    for(int i = 1; i < n ; i++){
        if(str[i-1] == str[i]) c1 ++;
        else{
            flag = 0;
            break;
        }
    }
       if(flag){
        cout << ((n+1)*n/2)%MOD << endl;
        return 0;
    }
    //记录后面相同个数,不满足flag后面必然至少一个不同
    for(int i = n - 2; i > 0 ;--i ){
        if(str[i] == str[i+1]) c2 ++;
        else break;
    }
 
    if(str[0] == str[n-1]) cout << ((ll)(c1 + 1) * (ll) (c2+1))%MOD << endl;
    else cout << ((ll)c1+(ll)c2+(ll)1)%MOD << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值