专栏文章
题解:P12422 【MX-X12-T5】「ALFR Round 5」Another string problem
P12422题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip1g574
- 此快照首次捕获于
- 2025/12/03 04:36 3 个月前
- 此快照最后确认于
- 2025/12/03 04:36 3 个月前
看到子序列,考虑建子序列自动机,在自动机上暴力搜索匹配。
直接暴力做肯定是过不了的,考虑剪枝。
当 中剩下未匹配的位置少于 中未匹配位置时必然无解。
当匹配跳过的距离总和大于 次时必然无解。
最后再记忆化一下即可。
代码:
CPP#include<bits/stdc++.h>
#include<bits/extc++.h>
#define ll long long
using namespace std;
ll read(){
ll x=0,f=1;char ch=getchar_unlocked();
while(ch<'0'||'9'<ch){if(ch=='-')f=-1;ch=getchar_unlocked();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar_unlocked();}
return f*x;
}
const int N = 2e5+5;
int T,n,m,q,nxt[N][30],now[30],k;
char s[N],t[N];
unordered_map<string,bool>mp;
bool dfs(int i,int j,int k,int sum){//printf("%d %d %d\n",i,j,k);
if(k<=0)return 1;if(i==-1)return 0;if(n-i<k*m-j)return 0;if(sum>=m)return 0;
return dfs(nxt[i][t[j==m?1:j+1]-'a'],j==m?1:j+1,k-(j==m),sum+nxt[i][t[j==m?1:j+1]-'a']-i-1);
}
void solve(){mp.clear();
scanf("%s",s+1);n=strlen(s+1);q=read();
for(int i=0;i<26;i++)now[i]=-1;
for(int i=n;i>=0;i--){
for(int j=0;j<26;j++)nxt[i][j]=now[j];
if(i>0)now[s[i]-'a']=i;
}while(q--){string sb="";
scanf("%s",t+1);m=strlen(t+1);k=n/m;
for(int i=1;i<=m;i++)sb+=t[i];
if(mp.find(sb)==mp.end()){
bool flag=dfs(0,0,k,0);puts(flag?"Yes":"No");
if(flag)mp[sb]=1;else mp[sb]=0;
}else puts(mp[sb]?"Yes":"No");
}
}
int main(){
T=read();while(T--)solve();
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...