Distinct Sub-palindromes(思维题)

题目链接
题目:设一个字符串的值为其所含回问子串的个数,给你一个数字n,全由小写字母构成的长度为n的值最小的字符串由多少个。

思路:分两种情况,当n小于3的时候任意字符串的值都相等,稍微想想就知道如果字符串中每个字符不同那么值就为长度,当有字符是同一字符时,虽然长度为1的回文子串少了但长度大于1的回文子串必然增加所以值还是等于n.但当n大于3时情况发生了改变,含有相同字符时子串可能不会增加如:abca,原因是因为中间含有两个不同的字符导致不回文,所以我们构造字符串时相同字符之间至少要隔两个字符,又为了使回文串最少所以只能隔两个。又因为单个不同的字符也算一个回文串。为了使值最少所以后面使用的字符要尽可能是前面已经出现过的字符。所以根据上述条件可以得出一个简单但深刻的结论:该字符串是以前三个不同字符为循环节的字符串时值最小。
ac代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define int long long
const int mod = 998244353;
signed main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t; cin >> t;
    while (t--) {
        int a; cin >> a;
        if (a == 1) cout << 26 << endl;
        if (a == 2) cout << 676 << endl;
        if (a == 3) cout << 17576 << endl;
        if (a > 3) {
            cout << 26 * 25 * 24 << endl;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值