1. 程式人生 > >BZOJ 4503. 兩個串

BZOJ 4503. 兩個串

clu desc its print 給定 des info 圖片 include

Description

兔子們在玩兩個串的遊戲。給定兩個字符串S和T,兔子們想知道T在S中出現了幾次,
分別在哪些位置出現。註意T中可能有“?”字符,這個字符可以匹配任何字符。

Solution

技術分享圖片

Code

註意匹配的首位置往後必須有超過T.size()個字符.

#include <bitset>
#include <string>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
const int N = 1000005;

std:: bitset<N> A[26];
int main () {
    std:: string S, T;
    std:: cin >> S >> T;
    for (int i = 0; i < S.size(); i += 1)
        A[S[i] - 'a'].set(i);
    std:: bitset<N> res;
    res.set();
    for (int i = 0; i < T.size(); i += 1)
        if (T[i] != '?')
            res &= (A[T[i] - 'a'] >> i);
    int Res = 0;
    for (int i = 0; i + T.size() - 1 < S.size(); i += 1)
        if (res[i] == 1)
            Res += 1;
    printf("%d\n", Res);
    for (int i = 0; i + T.size() - 1 < S.size(); i += 1) 
        if (res[i])
            printf("%d\n", i);
    return 0;
}

BZOJ 4503. 兩個串