题目
题解
暴力。
字符串操作的题百分之八九十都要用substr、find和map。
这个题直接暴力枚举分割点,左侧暴力遍历每个子串,判断是否为正回文子串;右侧也暴力遍历每个子串,找出正回文子串的个数,用总子串个数一减就是非正回文子串个数了;维护最大乘积。
居然这么暴力,离谱,数据量给的也离谱。
代码
#include<bits/stdc++.h>
using namespace std;
int ans, n;
string s;
map<string, int> vis;
bool check(string str, int len) {
if(vis[str]) return false; // 遍历过
for(int i = 0;i < len/2;i ++) // 判断是否为回文
if(str[i] != str[len-i-1]) return false;
vis[str] = 1;
return true;
}
int main()
{
cin>>n>>s;
for(int i = 1;i < n;i ++) {
int a = 0, b = 0;
vis.clear(); // !!!
for(int len = 1;len <= i;len += 2) { // 左边
for(int j = 0;j+len <= i;j ++)
if(check(s.substr(j, len), len)) a++;
}
for(int len = 1;len <= n-i;len += 2) { // 右边
for(int j = i;j + len <= n;j ++)
if(check(s.substr(j, len), len)) b++;
}
ans = max(ans, a*((n-i)*(n-i-1)/2 - b)); // 右边: 非正回文子串个数 = 全部子串个数-正回文子串个数
}
cout << ans << endl;
return 0;
}