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

只要分三种情况:

所有字母都一样 头尾字母一样,中间有不一样的 头尾不一样 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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值