BZOJ 4503. 兩個串
阿新 • • 發佈:2018-10-11
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. 兩個串