2020 Multi-University Training Contest 1-1004 Distinct Sub-palindromes

http://acm.hdu.edu.cn/showproblem.php?pid=6754

 题意:

  字符串由小写字母构成

  求 长度为N的 回文子串数量最少的 字符串的个数

思路:

  长度为1的串 回文子串最少1个  形式:a

  长度为2的串 回文子串最少2个  形式:aa / ab

  长度为3的串 回文子串最少3个  形式:aaa / aab aba abb / abc

  经试验,

  长度为4的串 回文子串最少1个  形式:abca

  猜想,长度>3的串 最少可以只有3个回文子串(abcabc... 其中只构成 a b c 3个回文串

  证明:添加字母会增加新的子串d使得回文子串数目>=4,减少到两个或者一个字母会不足以维持只有3个回文子串,3个字母保证3种回文子串只有一种排列

编码:

  分为长度 1、2、3、>3,分别输出结果

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include <vector>
#include <iterator>
#include <utility>
#include <sstream>
#include <limits>
#include <numeric>
#include <functional>
using namespace std;
#define gc getchar()
#define mem(a) memset(a,0,sizeof(a))
//#define sort(a,n,int) sort(a,a+n,less<int>())

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

long long Mode(long long a, long long b, long long mode)
{
    long long sum = 1;
    while (b) {
        if (b & 1) {
            sum = (sum * a) % mode;
            b--;
        }
        b /= 2;
        a = a * a % mode;
    }
    return sum;
}

int main()
{
    int T = 0;
    long long n = 0;
    cin >> T;
    while(T--)
    {
        cin >> n;
        if(n == 1)
        {
            cout << 26 << endl;
            continue;
        }
        else if(n == 2)
        {
            cout << 26 + 26*25 << endl;
            continue;
        }
        else if(n == 3)
        {
            cout << 26 + 26*25*3 +26*25*24 << endl;
            continue;
        }
        else
        {
            cout << 26*25*24 << endl;
            continue;
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SutsuharaYuki/p/13376489.html