根据题目描述我们可以看出来这是计算平行四边形(全是1的时候就是正方形)中最大的矩形面积。
首先求出最长的连续1的子序列,一种情况是两端不全为1,此时从0开始枚举即可,另一种情况是两端均为1。第二种情况我自己想是从后和从前分别寻找再相加,但是tutorial上的回答是s先加上自己,然后再寻找最长连续1的子序列,非常妙a!
然后如果是矩形的话,按照一条边为(k+1)/2, 另一条边为(k+2)/2来计算面积。(这里就不讲如何推导了)
易错点:
1.开long long 。我是全开longlong才过的
2.while循环的正确书写((条件)&&i<len){i++;……}循环的范围不要忘。
还有,在循环内一旦出现不符合就跳出的语句不要忘了写!!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
string s;
int main()
{
int t;
cin>>t;
while(t--){
cin>>s; int len=s.length();//cout<<len<<endl;
if(s[0]=='0'&&len==1)cout<<0<<'\n';
else if(s[0]=='1'&&len==1)cout<<1<<'\n';
else{
//cout<<1<<endl;
ll res=0;ll pos=0;
for(int i=0;i<len;i++){
while(s[i]=='1'&&i<len)
{pos++;i++;}
res=max(res,pos);pos=0;
//cout<<res<<endl;
}
if(res==len){
cout<<ll(res*res)<<'\n';
}
else{
if(s[0]=='1'&&s[len-1]=='1'){
for(int i=0;i<len;i++){
if(s[i]=='1')pos++;
else break;
}
for(int i=len-1;i>=0;i--){
if(s[i]=='1')pos++;
else break;
}
res=max(res,pos);
}
if(res==1)cout<<1<<'\n';
else{
ll k1=(res+1)/2;
ll k2=(res+2)/2;
cout<<k1*k2<<'\n';
}
}
}
}
return 0;
}