CF1063A Oh Those Palindromes
题意:
一个非空字符串叫做回文串。如果它从左到右,从右到左读相同,那么它就是回文串。 例如,“ABCBA”,“A”和“ABBA”都是回文串,而“ABAB”和“XY”则不是。
如果可以通过从字符串的开头和结尾删除一些(可能为零)字符来从该字符串获得新字符串, 则新字符串叫做另一个字符串的子字符串。 例如,“ABC”、“AB”和“C”是字符串“ABC”的子串,而“AC”和“D”不是。
我们把字符串的“回文计数”定义为回文的子串个数。 例如,字符串“aaa”的回文计数是6,因为它的所有子字符串都是回文, 而字符串“abc”的回文计数是3,因为只有长度为1的子字符串是回文。
给你一个字符串S。你可以任意地重新排列它的字符,求它的回文计数最大值。
题解:
比赛时写写各自情况,通过的也不少,就盲猜只要相同的靠在一起好像就行,结果真过了,但是不知道怎么证明
考虑简单情况,对于只含一种元素的串,我们要插入其他元素
记原有元素为a,新加元素为b
考虑b的最优插入位置
原串aaaa…aa,插入b
设b在串中的插入位置为pos,插入后,原本的回文串[pos−i,pos+j](i!=j)[pos−i,pos+j] (i!=j)[pos−i,pos+j](i!=j)会因此不匹配
所以这样不会使得原串匹配结果变多
所以我们要让各个元素独立才是最优方案
代码:
#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime = clock ();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
int a[40];
int main()
{//rd_test();int n;read(n);string s;cin>>s;for(int i=0;i<s.length();i++){int x=s[i]-'a';a[x]++;}
// queue<int>q;
// stack<int>s;for(int i=0;i<26;i++){while(a[i]--){cout<<(char)(i+'a');} }//Time_test();
}