首页 > 其他分享 >2019南昌大学邀请赛 M. Subsequence 序列自动机

2019南昌大学邀请赛 M. Subsequence 序列自动机

时间:2023-02-07 12:04:00浏览次数:35  
标签:loc now nex int SS Subsequence 2019 南昌大学 include


 

Give a string SS and NN string T_iTi , determine whether T_iTi is a subsequence of SS.

If ti is subsequence of SS, print ​​YES​​​,else print ​​NO​​.

If there is an array \lbrace K_1, K_2, K_3,\cdots, K_m \rbrace{K1,K2,K3,⋯,Km} so that 1 \le K_1 < K_2 < K_3 < \cdots < K_m \le N1≤K1<K2<K3<⋯<Km≤N and S_{k_i} = T_iSki=Ti, (1 \le i \le m)(1≤i≤m), then T_iTi is a subsequence of SS.

Input

The first line is one string SS,length(SS) \le 100000≤100000

The second line is one positive integer N,N \le 100000N,N≤100000

Then next nn lines,every line is a string T_iTi, length(T_iTi) \le 1000≤1000

Output

Print NN lines. If the ii-th T_iTi​ is subsequence of SS, print ​​YES​​​, else print ​​NO​​.

样例输入复制


abcdefg 3 abc adg cba


样例输出复制


YES YES NO


 

题意:给定序列A,和N个序列Bi,若Bi是A的一个子序列(不一定连续)。

分析:

序列自动机模板题

nex[maxn][26]:表示第i个字符后面第一次出现字符j(a-z用0-25表示)的位置。

我们从后往前求,now[j]:字符j从后往前数最晚出现的位置(now数组初始化为-1)

对于每个i,我们都用now[0-25]来更新nex[i][0-25]的值

每经过一个i,我们就更新now数组~使得now数组表示的是最新的状态

但是两个字符串开始的字符是相等的,就没法判断,因为nex[0][j]表示的是0位置后的第一个出现j的位置。所以就要先判断

int loc=now[s[0]-'a']

若loc不为-1,
 

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef pair<int,int>P;
const int INF=0x3f3f3f3f;
const int N=1000010,mod=32767;
char s[N],p[N];
int nex[N][30],now[N];
//nex[i][j]:=表示第i个字符后面第一次出现字符j(a-z用0-25表示)的位置。
//我们从后往前求,now[j]:=字符j从后往前数最晚出现的位置(now数组初始化为-1)
void init()
{
memset(now,-1,sizeof(now));
int len=strlen(s);
for(int i=len-1; i>=0; i--)
{
for(int j=0; j<26; j++)
{
nex[i][j]=now[j];
}
now[s[i]-'a']=i;
}
}

int main()
{
int n,len,loc,flag;
scanf("%s",s);
init();
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%s",p);
len=strlen(p);
loc=now[p[0]-'a'];
if(loc==-1)
printf("NO\n");
else
{
flag=0;
for(int i=1; i<len; i++)
{
loc=nex[loc][p[i]-'a'];
if(loc==-1)
{
flag=1;
break;
}
}
if(!flag)
printf("YES\n");
else
printf("NO\n");
}
}
}

 

标签:loc,now,nex,int,SS,Subsequence,2019,南昌大学,include
From: https://blog.51cto.com/u_14932227/6041850

相关文章

  • 2019南昌网络赛 I. Max answer(DP或者单调栈+思维)
    Alicehasamagicarray.Shesuggeststhatthevalueofaintervalisequaltothesumofthevaluesintheinterval,multipliedbythesmallestvalueinthein......
  • 2019/4/20、21训练博客
         一场中山大学的校赛,一场南昌大学网络赛.    两场都有遗憾,因为基本上前期还ok,但到后期就难以出题了,尤其是昨天的南昌大学网络赛,一道题已经房队......
  • 2019/4/18
     今天把最近打的51nod的比赛认为好题或者比赛的时候没做出来、没做到的题补了补,这些题,大部分都做过,看着眼熟,但依旧有的能出,有的不能出,害的好好下功夫,至少省赛前把三集题做......
  • C# - VS2019 WINFRM应用程序开发报表
    简单报表我们可以通过label、textBox和PrintDialog来实现,但是一般在实际生产过程中,用户的报表需求一般都是比较复杂的。本篇主要记录对于传统中国式复杂报表的处理方法和......
  • 解决VS2019编译Qt报错:C3615 constexpr 函数“qCountLeadingZeroBits”不能生成常量表
    这个是Qt的BUG,要解决编译报错的问题,需要修改Qt安装目录下的一个文件:Qt\Qt5.9.5\5.9.5\msvc2015\include\QtCore\qalgorithms.h建议修改之前先保存一个副本,另外要根据编译......
  • P5572 [CmdOI2019]简单的数论题
    [CmdOI2019]简单的数论题题意即求:\[\sum_{i=1}^{n}\sum_{j=1}^{m}\varphi\left(\dfrac{\operatorname{lcm}(i,j)}{\gcd(i,j)}\rig......
  • 2019年7月31 日训练日记
    早上把昨晚打cf没做出来的题讨论了一下,发现我们原来理解的题意完全不一样,然后看了看别人的代码,发现思路特别巧妙。上午把vjudge的题补完了,然后又把cf可以做没做出来的题补完......
  • 2019计蒜之道初赛第一场 A 商汤的AI伴游小精灵(DFS)
    Description北京市商汤科技开发有限公司面向青少年研发了一款智能伴游机器人--AI伴游小精灵。一经推出,深受孩子们的喜爱,可爱又机智的小精灵会想出很多有趣的小游戏来启迪......
  • 2019年5月22日训练日记
    最近天气是越来越热了,变得特别累,忙着复习电子和大物,感觉都要挂,所以做题的时间有所减少,但是还可以保证一天至少两道题,一道洛谷,一道vjudge的,时间多还可以自己额外做一道,然后我......
  • CTU Open Contest 2019 B Beer Bill(模拟)
    题意:计算字符串的价格。给多个字符串,每个串占一行。字符串分两种,一种字符串名为只含有个字符,这种字符串的价格定义为。另一种字符串名为,格式是以数字开头......