题目大意是有一个01字符串
A binary string is a string consisting only of the characters 0 and 1. You are given a binary string s.
For some non-empty substring† t of string s containing x characters 0 and y characters 1, define its cost as:
Given a binary string s of length n, find the maximum cost across all its non-empty substrings.
有三种计算这个01字符串的规则:
if x>0 and y>0;
x*y;
if x>0 and y=0;
x*x;
if x=0 and y>0.
y*y;
输入一个t表示有n组数据
输入一个n表示字符串长度,接着输入字符串
我们可以发现:
当字符串是01相间的,x*y最大显然是整个字符串(不删减其中任何一个元素,x或y就是最大的)
当字符串连续的0,或者连续的1,大于x*y时,最大的是后两个规则。(删减其中的元素,只能从头或者尾删除,并且要求1全删除,或者0全删除才能使用平方规则)
//要么操作整个数组(因为混合串能得到的最大的必然是整个串)
//要么找到最大的连续1或相同0。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
ll n;
string s;
cin>>n>>s;
ll len1=0,len0=0;
ll maxv0=0,maxv1=0;
if (s[n-1]=='0')
s[n]='1'; //为了方便下面的最大0的计算,我们在最后一个元素为0之后添加一个1
else
s[n]='0'; //为了避免下面判断的时候数组下表越界,我们需要将s[n]赋值
ll len00=0,len11=0; //用来记录所有的0和1(未经过删减之前)
for (int i=0;i<n;i++) {
if (s[i]=='0') {
len0++;
len00++;
}
if (s[i]=='0'&& s[i+1]=='1') {
maxv0=max(maxv0,len0); //记录连续的0最多有多少个
len0=0; //记录被1阻隔的连续0个数之后,重新赋值为0
}
if (s[i]=='1') {
len1++;
len11++;
}
if (s[i]=='1'&& s[i+1]=='0') {
maxv1=max(maxv1, len1); //与0的操作同理
len1=0;
}
}
ll p=max(pow(maxv0,2),pow(maxv1,2)); //最大0的个数平方和最大1的个数平方比较
ll maxv=max(p,len00 * len11); //比较后的结果再与删减之前的0的个数和1的个数相乘比较
cout<<maxv<<endl; //输出最大的值
}
int main(void) {
int t;
cin>>t;
while (t--) {
solve();
}
}