这是一道神奇的暴力题,题意就是给你一个长度为n的二进制串,然后求出来他的一个长度大于等于他2/n 下取整的 两个长度不一定相等的字符串,让其中一个字符串的倍数是另一个字符串,这道题很简单,如果说任何一个大于n/2字符串的字符串的下一位是0,那么我们完全可以让这个字符串乘以2就可以得到这个 与之对应的字符串后面加上个零所对应数。 然后再判断这个长度大于n/2 的字符串前面是否有零,如果有的话,就仅仅多一个前导零而已,两个二进制字符串对应的数还是一样的。然后我们发现只需要在整个字符串中存在0,那么两种情况就一定会出现其中一种,还有一种就是字符串全部都为1,那么我们只需要输出两个长度相同,但左右端点不同的下标即可。
题目:
ac代码
#include<iostream>
#include<cstdio>
#include<unordered_map>
#include<algorithm>
using namespace std;
typedef long long int LL;
typedef pair<int,int> PII;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n ;
string a;
cin >> a;
a = '*' + a;
unordered_map<string, PII > mp ;
int len = n / 2;
for(int i = 1; i + len - 1 <= n ; i ++)
{
string b = a.substr(i,len);
if(mp.count(b))
{
cout << mp[b].first<<' '<<mp[b].second <<' '<< i <<' '<< i + len - 1 <<endl;
break;
}
if(a[i-1] == '0')
{
cout << i <<' '<<i + len - 1 <<' '<< i - 1 <<' '<< i + len - 1<<endl;
break;
}
if(i + len <= n && a[i + len] == '0')
{
cout << i <<' '<< i + len <<' '<< i<<' '<< i + len - 1 <<endl;
break;
}
mp[b] = {i,i+len-1};
}
}
}