ABC242E

Problem

给你一个字符串,要求有多少个一样长的回文串小于它。

Solution

因为回文字符串的两边是一样的,所以我们只需要先看字符串的一半,然后判断一下是左边一半大还是右边。

    string tmp=s.substr(0,n/2);
    reverse(tmp.begin(),tmp.end());
    if(s>=(s.substr(0,(n+1)/2)+tmp)) ans++;

对于前面的正常统计 $1\Rightarrow \cfrac{(n+1)}{2}$ 就好了:
$$ans=ans\times26+s_i$$

Code

应该挺好看的吧。

#include<bits/stdc++.h>
using namespace std;
using LL=long long;
const LL mod=998244353;
LL n,q;
string s;
int main(){
    cin>>q;
    while(q--){
        LL ans=0;
        cin>>n>>s;
        for(int i=0;i<(n+1)/2;i++){
            ans*=26;
            ans=(ans+LL(s[i]-'A'))%mod;
        }
        string tmp=s.substr(0,(n)/2);
        reverse(tmp.begin(),tmp.end());
        if(s>=(s.substr(0,(n+1)/2)+tmp)) ans++;
        cout<<ans%mod<<endl;
    }
    return 0;
}