题解:CF2048C Kevin and Binary Strings
lailai0916 · · 题解
题意简述
给定一个以
解题思路
设字符串
显然,第一个子串应选取整个字符串
接下来的目标是让第二个子串的异或结果尽可能大。为了实现这一点,我们需要找到最右边的一个
将第二个子串的选择转化为在字符串
参考代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=5005;
int nxt[N];
int kmp(string s,string t)
{
int n=s.size(),m=t.size();
for(int i=1;i<m;i++)
{
int j=nxt[i-1];
while(j&&t[i]!=t[j])j=nxt[j-1];
if(t[i]==t[j])j++;
nxt[i]=j;
}
int j=0;
for(int i=0;i<n;i++)
{
while(j&&s[i]!=t[j])j=nxt[j-1];
if(s[i]==t[j])j++;
if(j==m)return i-m+1;
}
return -1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
int n=s.size(),m=n-1;
string t=s;
for(int i=n-1;i>=0;i--)
{
t[i]='0'+'1'-t[i];
if(s[i]=='0')m=i;
}
int x=0;
for(int i=m;i<n;i++)
{
int k=kmp(t.substr(0,i),s.substr(m,i-m+1));
if(k==-1)break;
x=k;
}
cout<<1<<' '<<n<<' '<<x+1<<' '<<x+n-m<<'\n';
}
return 0;
}