zoukankan      html  css  js  c++  java
  • 序列自动机模板

    题目链接:https://nanti.jisuanke.com/t/38232

    题意:有一个字符串s1,现在给你n个字符串s2,每次你需要回答s2是否是s1的子序列。

    解题心得:

    序列自动机其实就是先预处理出来一个数组,Next[i][j]表示在位置 i 的后面第一个字符 j 所在的位置,预处理出Next数组的复杂度就是log(N∗26)
    每次询问就是log(M)的复杂度(M是每次询问字符串的长度)。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+100;
    
    int Next[maxn][30], n, len;
    char first[maxn], second[maxn];
    
    void init() {
        scanf("%s", first+1);
        len = int(strlen(first+1));
    
        for(int i=len;i>=1;i--) {
            if(i == len){
                for(int j=0;j<30;j++) {
                    Next[i][j] = len+1;
                }
            }
            for(int j=0;j<30;j++) {
                Next[i-1][j] = Next[i][j];
            }
            Next[i-1][first[i] - 'a'] = i;
        }
    }
    
    bool find() {
        int pos = 0;
        int len2 = int(strlen(second));
        for(int i=0;i<len2;i++) {
            pos = Next[pos][second[i]-'a'];
            if(pos > len) return false;
        }
        return true;
    }
    
    int main() {
    //    freopen("1.in", "r", stdin);
        init();
    
        scanf("%d", &n);
        while(n--) {
            scanf("%s", second);
            if(find()) {
                printf("YES
    ");
            } else {
                printf("NO
    ");
            }
        }
    
        return 0;
    }
    
  • 相关阅读:
    mysql慢查询
    linux查找文件
    ss安装教程
    node_module删除
    api的错误代码设计
    es6的Promise
    vue后台项目
    vue的main.js
    vue的过渡效果
    【Linux网络基础】网络拓扑、OSI层次模型、TCP/IP协议簇
  • 原文地址:https://www.cnblogs.com/shmilky/p/14089028.html
Copyright © 2011-2022 走看看