8.28NOIP Day13模拟赛
T1
容易设计状态为 当前a匹配到第i个,b匹配到第j个,然后转移是 \(O(ns^2)\) 的,会被卡掉
题目只要求是否可行,所以我们会开出一车bool
我也不知道为什么 zzy 能想到换成bitset,反正我换成bitset后还要压成一维数组反复位运算,这么写的纯沙比吧
#include<bits/stdc++.h>
#define N 500005
using namespace std;
char s[N],a[55],b[55];
bitset<2505>dp,f,pa[55],pb[55],xa[30],xb[30];
signed main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%s",s+1);
int n=strlen(s+1);
scanf("%s",a+1);
int m1=strlen(a+1);
scanf("%s",b+1);
int m2=strlen(b+1);
dp=0;
dp[0]=1;
for(int i=0;i<m1;i++){
pa[i]=0;
int u=(i-1+m1)%m1;
for(int j=u*m2;j<u*m2+m2;j++)pa[i][j]=1;
}
for(int i=0;i<m2;i++){
pb[i]=0;
int u=(i-1+m2)%m2;
for(int j=0;j<m1;j++)pb[i][j*m2+u]=1;
}
for(int i=0;i<26;i++){
xa[i]=xb[i]=0;
for(int j=0;j<m1;j++)if(a[j+(!j)*m1]=='a'+i)xa[i]|=pa[j];
for(int j=0;j<m2;j++)if(b[j+(!j)*m2]=='a'+i)xb[i]|=pb[j];
}
for(int i=1;i<=n;i++){
f=0;
f|=(((dp&xa[s[i]-'a'])<<m2)|((dp&xa[s[i]-'a']&pa[0])>>(m1*m2-m2)));
f|=((((dp&xb[s[i]-'a'])^(dp&xb[s[i]-'a']&pb[0]))<<1)|((dp&xb[s[i]-'a']&pb[0])>>(m2-1)));
dp=f;
}
if(dp[0])printf("Yes\n");
else printf("No\n");
}
return 0;
}

浙公网安备 33010602011771号