天天看點

藍橋杯2015年第六屆真題-切開字元串題目題解代碼

題目

題目連結

題解

暴力。

字元串操作的題百分之八九十都要用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;
}

           
上一篇: 身份證