[ABC287D] Match or Not

[ABC287D] Match or Not

有意思的简单题.

我们不妨把第一个字符串设为 aa 串,第二个设为 bb 串。

显然,如果一个 aa 串的一个字母有用去组成新的串和 bb串进行比较,那么只要用到这个字母,他所对应的 bb 串的字母就是一样的,不会改变。

很自然想到前缀和。

如果当前 aa 串这个字母和 bb 串对应字母匹配,那就标记为 00,不匹配就标记为 11

由于 aa 串需要有两个部分去组成新的字符串比对,所以考虑预处理两个前缀和数组,一个是从后往前,一个是从前往后。

如果当前询问长度为 ii 的串,那就是从前往后的长度是 ii。从后往前的长度就是 size(b)isize(b)-i

查询这两部分的和是不是 00 判断就好。

#include<bits/stdc++.h>
    using namespace std;
    const int N =1e6+10;
    char s[N],t[N];
    int s1[N],s2[N];
    int main()
    {
    	scanf("%s",s+1);
    	scanf("%s",t+1);
    	int n=strlen(s+1);
    	int n1=strlen(t+1);
    	for(int i=n-n1+1,j=1;i<=n;i++,j++)
    	{
    		if(s[i]==t[j]||s[i]=='?'||t[j]=='?')
    			s1[j]=0;
    		else
    			s1[j]=1;
    	}	
    	for(int i=1;i<=n1;i++)
    	{
    		if(s[i]==t[i]||s[i]=='?'||t[i]=='?')
    			s2[i]=0;
    		else
    			s2[i]=1;
    	}
    	for(int i=1;i<=n1;i++)
    		s1[i]+=s1[i-1],s2[i]+=s2[i-1];
    	for(int i=0;i<=n1;i++)
    	{
    		if(s1[n1]-s1[i]+s2[i]==0)//
    			 cout<<"Yes"<<endl;
    		else
    			cout<<"No"<<endl;
    	}
    }
    /*
    a?c
    b?
    */
posted @   June_Failure  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示