1. 程式人生 > 實用技巧 >2020 Multi-University Training Contest 1-1004 Distinct Sub-palindromes

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; }