题目:
题意解析:
这个题目是要求找出输入的字符串,,字符串的循环移位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;
}