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\n",a.count());
21     for (int i=0; i<sl; ++i)
22         if (a[i]) printf("%d\n",i);
23 }
posted @ 2019-02-17 10:15  Refun  阅读(188)  评论(0编辑  收藏  举报