刚才div2 B求问,大概思路就是将每一个需要操作的区间(两个字符串不一样)的地方记录下来,如果能合并就合并,但是拿了暴力分(对拍8以下的数据没问题)。想问一下是做法假了还是出现了什么问题。
LOJ的数据(重题)没过,应输出5,实际输出6
1
001100010010000110
110110001000100101
另外除subtask1外的所有点全wa,没有TLE
如果能给个数据解释也非常感谢。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
char t[N],s[N];
int T,ans,lst,nxt,is0,is1,n;
struct node{
int l,r;
bool qs0,qs1;
node(int ll,int rr,bool is0,bool is1){
l=ll,r=rr;qs0=is0,qs1=is1;
}
bool operator<(const node &A)const {
return this->l<A.l;
}
};
deque<node> q;
int qzh[N];
int main(){
//freopen("in.txt","r",stdin);
//freopen("my.txt","w",stdout);
cin>>T;
//int loj_n;
//cin>>loj_n;
while(T--){
cin>>(s+1)>>(t+1);
while(q.size())q.pop_back();
is0=is1=1;
nxt=0;
lst=0;
n=strlen(s+1);
for(int i=1;i<=n;i++){
qzh[i]=qzh[i-1]+(t[i]-'0');
if(s[i]==t[i]){
if(nxt!=0){
q.push_back(node(lst+1,nxt,is0,is1));
nxt=0;
is0=1;is1=1;
}
lst=i;
is0=1;is1=1;
}
else{
if(t[i]=='1')is0=0;
else is1=0;
nxt=i;
}
}
if(nxt!=0){
q.push_back(node(lst+1,nxt,is0,is1));
nxt=0;
}
if(!q.size()){
cout<<0<<endl;continue;
}
int flag=1;
while(q.size()>1){
node t1=q.front();q.pop_front();
node t2=q.front();q.pop_front();
//cout<<t1.l<<" "<<t1.r<<" "<<t2.l<<" "<<t2.r<<endl;
if(t2.l<t1.r){
q.push_front(t2);
q.push_back(t1);
if(!flag){
break;
}
flag=0;
continue;
}
if(t1.qs0 and t2.qs0 and qzh[t2.l]-qzh[t1.r]==0){
node t3(t1.l,t2.r,1,0);
q.push_front(t3);
flag=1;
}
else if(t1.qs1 and t2.qs1 and qzh[t2.l]-qzh[t1.r]==t2.l-t1.r){
q.push_front(node(t1.l,t2.r,0,1));
flag=1;
}
else{
q.push_back(t1);
q.push_front(t2);
}
}
cout<<q.size()<<endl;
}
return 0;
}