首页 > 其他 > 详细

BZOJ 4503. 两个串

时间:2018-10-11 20:01:07      阅读:160      评论:0      收藏:0      [点我收藏+]

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. 两个串

原文:https://www.cnblogs.com/qdscwyy/p/9774623.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!