只要分三种情况:
所有字母都一样 头尾字母一样,中间有不一样的 头尾不一样 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; }