• 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 }
  • 相关阅读:
    [SDOI2016]排列计数
    Broken robot
    环路运输
    naptime
    Accumulation Degree
    选课
    没有上司的舞会
    金字塔
    Polygon
    石子合并
  • 原文地址:https://www.cnblogs.com/refun/p/10390274.html
Copyright © 2020-2023  润新知