序列自动机裸题(南昌邀请赛M)

各种自动机(待补)

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

#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");
        }
    }
}

原文地址:https://www.cnblogs.com/Agnel-Cynthia/p/10947280.html

时间: 2024-08-30 14:45:31

序列自动机裸题(南昌邀请赛M)的相关文章

HDU 2896 ac自动机裸题

病毒侵袭 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋――我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒.小t不幸成为受害者之一.小t如此生气,他决定要把世界上所有

Nowcoder contest 392 J (模板题)【序列自动机】

<题目链接> 题目大意:给你一个母串A,然后进行q次询问,每次询问给定一个长度不超过母串的字符串,问你这个字符串是否是母串的子串. 解题分析:序列自动机模板题.本题的思想就是考虑贪心的去匹配,我们希望当前匹配到的位置越靠前越好.所以对于母串每一位都记一下下一次出现某个字符的位置.匹配的时候从第零位(虚根)开始,如果能一直匹配下去就是$Yes$ ,否则就是 $No$,这些操作就是用序列自动机简单实现. 单次查询的复杂度是$O(|B_i|)$ 的,序列自动机预处理的复杂度是 $O(26|A|)$的

2019ICPC南昌邀请赛现场赛A题 - Attack(斯坦纳树)

题意: 给出一张图,求让\(4\)对点相互可以到达的最小边权值.仅要求一对之间,一对与另外一对可到达也可不到达. 分析: 斯坦纳树裸题,众所周知斯坦纳树仅能求出这\(4\)对点(关键点)的连通状况,如这\(4\)对点相互都连通,某点和某点连通等.然而让这\(4\)对点连通符合题目要求,但不一定是最优解(我可以让每对点直接相连),所以我们要对斯坦纳树求出的\(dp\)数组进行子集\(dp\)才能得到最优解. #include <bits/stdc++.h> using namespace std

hdu1159 poj1458 LCS裸题

HDU 1159 题意:找LCS 思路:裸题 n*m的写法,我的写法好像比较奇怪...用一个ci保存s2第i位可以做为s1的公共子序列的最大值,s1的每一位遍历s2,遍历的时候记录前面出现过的ci的最大值,ci一定是一个连序的上升序列,我的好像不是正经的LCS的算法,改天还是要学习一个的 AC代码: #include "iostream" #include "string.h" #include "stack" #include "qu

BZOJ 4032 HEOI2015 最短不公共子串 后缀自动机+序列自动机+BFS

题目大意:给定字符串A和B,求A最短的子串/子序列S满足S不是B的子串/子序列 这题真TM有毒*2 搞法类似这道题 然后子串是后缀自动机 子序列自然就是序列自动机了= = 每更新一个x节点时所有没有x的后继的节点都连向这个节点 每个节点的parent是这个字母上一次出现的位置 每个字母记录最后一次出现的位置 更新指针时沿着parent指针撸一遍就行了 #include <cstdio> #include <cstring> #include <iostream> #in

SZOJ 167 Lca裸题

一道.......一道我改了一周的裸题 无根树建双向边 无根树建双向边 无根树建双向边 重要的事情说三遍(微笑) 还有要开longlong 还有双向边不是双倍边(微笑) 我真是,能把自己气吐血10次就不把自己气吐血9次 [问题描述] 已知一棵nn个点的树,点从1开始标号,树上每条边都有一个正整数边权. 有qq个询问,每个询问由type,u,vtype,u,v三个正整数构成. 当type=1type=1时,询问uu到vv路径上所有边权的二进制异或和. 当type=2type=2时,询问uu到vv路

LA 4670 出现次数最多的子串 (AC自动机模板题)

Dominating Patterns Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu [Submit]  [Go Back]  [Status] Description The archaeologists are going to decipher a very mysterious ``language". Now, they know many language patterns; ea

hdu5384 AC自动机模板题,统计模式串在给定串中出现的个数

http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsoft, the series' name is compounded from the Japanese words for "bullet" (dangan) and "refutation&q

HDU 4893 线段树裸题

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2512    Accepted Submission(s): 751 Problem Description Recently, Doge got a funny birthday present from his new friend, Pro