1 条题解

  • 0
    @ 2024-11-23 19:49:13

    先扫一遍字符串,判断有几个 1100 子串。 然后,对于每一次操作,可以算出对答案的影响,减去更改会减少的子串,再加上更改后会增加的子串。

    #include<bits/stdc++.h>
    using namespace std;
     
    char s[200001];
    int q,t;
    int n;
    int cnt;
     
    int p;
    char ch;
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	
    	cin>>t;
    	while(t--)
    	{
    	cin>>s;
    	n=strlen(s);
    	cin>>q;
    	cnt=0;
    	for(int i=0;i+3<n;i++)
    	{
    		if(s[i]=='1'&&s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='0')
    		{
    			cnt++;
    		}
    	}
    	
    	while(q--)
    	{
    		cin>>p>>ch;
    		
    		if(s[p-1]==ch)
    		{
    			if(cnt)
    				cout<<"YES\n";
    			else
    				cout<<"NO\n";
    		}
    		else{
    			if(p-1>=0&&p+2<n)
    			{
    				if(s[p-1]=='1'&&s[p]=='1'&&s[p+1]=='0'&&s[p+2]=='0')
    					cnt--;
    			}
    			if(0<=p-2&&p+1<n)
    			{
    				if(s[p-2]=='1'&&s[p-1]=='1'&&s[p]=='0'&&s[p+1]=='0')
    					cnt--;
    			}
    			if(0<=p-3&&p<n)
    			{
    				if(s[p-3]=='1'&&s[p-2]=='1'&&s[p-1]=='0'&&s[p]=='0')
    					cnt--;
    			}
    			if(0<=p-4&&p-1<n)
    			{
    				if(s[p-4]=='1'&&s[p-3]=='1'&&s[p-2]=='0'&&s[p-1]=='0')
    					cnt--;
    			}
    			s[p-1]=ch;
    			if(p-1>=0&&p+2<n)
    			{
    				if(s[p-1]=='1'&&s[p]=='1'&&s[p+1]=='0'&&s[p+2]=='0')
    					cnt++;
    			}
    			if(0<=p-2&&p+1<n)
    			{
    				if(s[p-2]=='1'&&s[p-1]=='1'&&s[p]=='0'&&s[p+1]=='0')
    					cnt++;
    			}
    			if(0<=p-3&&p<n)
    			{
    				if(s[p-3]=='1'&&s[p-2]=='1'&&s[p-1]=='0'&&s[p]=='0')
    					cnt++;
    			}
    			if(0<=p-4&&p-1<n)
    			{
    				if(s[p-4]=='1'&&s[p-3]=='1'&&s[p-2]=='0'&&s[p-1]=='0')
    					cnt++;
    			}
    			if(cnt)
    				cout<<"YES\n";
    			else
    				cout<<"NO\n";
    		}
    	}
    	}
    	return 0;
    }
    

    信息

    ID
    1082
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    41
    已通过
    10
    上传者