题目:
题意解析:
这个题目是要求找出输入的字符串,,字符串的循环移位s由k右边是字符串Sn−k+1...Sn,S1,S2...Sn−k。直到所有的字符,都循坏出现在字符串的开头,然后输入1形成的长方形的最大个数。
题解:
(1)这个题目你首先要找到,在输入的字符串中找到最长的连续的1字符串的长度。我的处理是将输入的字符串a,变成2a,求出2a的最长的1的字符的长度ans。
(2)找到最长的1的字符的长度ans:
<1>这里要特别判断一下,如果ans的长度等于字符串的长度,就输入a字符串的长度的平方。
<2>对于其他的情况,这里进行一个推算:
当ans为偶数的时候,+1与没有加一结果相同,我在这里判断一下ans是否为奇数。当然也可以不判断,直接加就行了。上面推导的公式,可以用很多种形式表示,不一定就是我写的这种。但是规律是唯一的。
代码:
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int t;
int main() {
cin>>t;
getchar();
while(t--) {
string a,c;
cin>>a;
a+=a;
// 得到最长连续的1的长度
long long int ans=0;
for(int i=0; i<a.size(); i++) {
if(a[i]=='1') {
long long int k=1;
i=i+1;
while(a[i]=='1'&&i<a.size()) {
k++;
i++;
}
ans=max(ans,k);
i-=1;
}
}
if(ans==a.size()) {
ans/=2;
cout<<ans*ans<<endl;
} else {
long long int t=ans/2;
if(ans%2==1) {
t++;
}
long long int sum=(ans-t+1)*t;
cout<<sum<<endl;
}
}
return 0;
}