zoukankan      html  css  js  c++  java
  • BZOJ4503:两个串(bitset)

    Description

    兔子们在玩两个串的游戏。给定两个字符串S和T,兔子们想知道T在S中出现了几次,
    分别在哪些位置出现。注意T中可能有“?”字符,这个字符可以匹配任何字符。

    Input

    两行两个字符串,分别代表S和T

    Output

    第一行一个正整数k,表示T在S中出现了几次
    接下来k行正整数,分别代表T每次在S中出现的开始位置。按照从小到大的顺序输出,S下标从0开始。

    Sample Input

    bbabaababaaaaabaaaaaaaabaaabbbabaaabbabaabbbbabbbbbbabbaabbbababababbbbbbaaabaaabbbbbaabbbaabbbbabab
    a?aba?abba

    Sample Output

    0

    HINT

    S 长度不超过 10^5, T 长度不会超过 S。 S 中只包含小写字母, T中只包含小写字母和“?”

    Solution

    虽然是$FFT$重题

    但$bitset$一波就赢了啊。

    Code

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<bitset>
     5 #define N (100009)
     6 using namespace std;
     7 
     8 char s[N],t[N];
     9 bitset<N>b[26],a;
    10 
    11 int main()
    12 {
    13     scanf("%s%s",&s,&t);
    14     int sl=strlen(s),tl=strlen(t);
    15     for (int i=0; i<sl-tl+1; ++i) a[i]=1;
    16     for (int i=0; i<sl; ++i)
    17         b[s[i]-'a'][i]=1;
    18     for (int i=0; i<tl; ++i)
    19         if (t[i]!='?') a&=(b[t[i]-'a']>>i);
    20     printf("%d
    ",a.count());
    21     for (int i=0; i<sl; ++i)
    22         if (a[i]) printf("%d
    ",i);
    23 }
  • 相关阅读:
    Luogu P1169 [ZJOI2007]棋盘制作 及悬线法浅谈
    P4338 [ZJOI2018]历史 P3703 [SDOI2017]树点涂色 题解
    多省联考2020游记
    min_25筛基础
    斯特林数、贝尔数与伯努利数基础
    后缀数组笔记
    分治FFT学习笔记
    多项式运算表
    基本积分公式表
    THUWC2019游记
  • 原文地址:https://www.cnblogs.com/refun/p/10390274.html
Copyright © 2011-2022 走看看