字符串摘记
求解小于等于一个字符串的回文串的个数
题目链接:E - (∀x∀)
考虑26进制,将字母A~Z 折算成数字0~25,求得最大的可能的回文字符串的26进制值即为答案
using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f,mod=998244353;
ll n;
string ss,rss;
void solve(){
cin>>n>>ss;
ll ans=0,l=(n-1)/2;
rss=ss;
ans=0;
for(int i=0;i<=l;++i){
ans=(ans*26+(ss[i]-'A'))%mod;//假设前半即为最大
rss[n-1-i]=rss[i];
}
ans=(ans+1)%mod;
if(ss<rss) ans=(ans+mod-1)%mod;//rss的作用就是为了减去目前找到的最大的一个不满足题意得情况
cout<<ans<<'\n';
return ;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int _=1;
cin>>_;
while(_--){
solve();
}
return 0;
}
最小表示法
最小表示法就是找出字符串S的的循环同构串中字典序最小的一个
std::string findMinimumRepresentation(const std::string& str) {
int n = str.length();
int i = 0, j = 1, k = 0;
while (i < n && j < n && k < n) {
if (str[(i + k) % n] == str[(j + k) % n]) {
k++;
} else {
if (str[(i + k) % n] > str[(j + k) % n]) {
i = i + k + 1;
} else {
j = j + k + 1;
}
if (i == j) {
j++;
}
k = 0;
}
}
int start = std::min(i, j);
return str.substr(start) + str.substr(0, start);
}
例题
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/17416112.html