題目
題目連結
題解
暴力。
字元串操作的題百分之八九十都要用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;
}