链接:https://ac.nowcoder.com/acm/contest/392/J
题意:给你一个字符串s,再给出n,接下来n行,每行一个字符串T,问T是不是s的子序列。和19年南昌网络赛的M题一模一样。https://nanti.jisuanke.com/t/38232
思路:序列自动机,解决的就是一个字符串是字符串的子序列。nex[i][j]代表距离i最近的字符j的位置。找的时候每次都找最近的,贪心的思想。每次按顺序找T的字符,找不到就是No,全找到就是Yes。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+10;
int nex[N][30],n,len,pos;
char s[N];
bool flag;
int main(void)
{
scanf("%s",s+1);
len=strlen(s+1);
for(int i=len;i>=1;i--)
{
for(int j=1;j<=26;j++)
nex[i-1][j]=nex[i][j];
nex[i-1][s[i]-'a'+1]=i;
}
scanf("%d",&n);
while(n--)
{
flag=1;
scanf("%s",s+1);
len=strlen(s+1);
pos=0;
for(int i=1;i<=len;i++)
{
pos=nex[pos][s[i]-'a'+1];
if(!pos)
{
flag=0;
break;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}
本文介绍了一种使用AC自动机解决字符串子序列判断问题的方法。通过预处理字符串构建状态转移矩阵,实现快速判断一系列字符串是否为给定字符串的子序列。此方法采用贪心策略,对于每个待测字符串,按顺序查找字符位置。
&spm=1001.2101.3001.5002&articleId=97026630&d=1&t=3&u=929a28214aab4c7c90e1205a11c707a0)
312

被折叠的 条评论
为什么被折叠?



