HDU-5972 Regular Number
阿新 • • 發佈:2018-12-13
題意: 給定一個正則表示式, 求一個字串中所有的匹配。(字串都是數字字元) 分析: 題目中的正則表示式給定的格式是:給定這個匹配的位數, 然後給定每個位數上的可以匹配的數字。在這裡引入STL中的bitset, bitset類可以輕鬆地設定一個二進位制位,對於這道題, 將給定的正則表示式轉化成bitset的格式, 對於每一個數字【0-9】將他的所在的要匹配的位置記錄下來,bitset很輕鬆實現, (bitset)b.set(i)表示將一個bitset資料型別的第i位設定為1。然後對於給定的字串, 直接在bitset中查詢某一位是否為1, 若為1那麼就可以匹配, 知道匹配數等於給定的要匹配的位數n, 輸出結果。 程式碼:
#include <bits/stdc++.h> using namespace std; const int N = 1000 + 10; const int MAXN = 5e6 + 10; char s[MAXN]; //int reg[N][22]; /* template <class T> inline bool _fscan(T &ret) { char c; int sgn; if (c == getchar(), c == EOF) return 0; while (c != '-' && (c > '9' && c < '0')) { c = getchar(); } sgn = (c == '-') ? -1 : 1; ret = (c == '-') ? '0' : (c - '0'); while (c = getchar(), c >= '0' && c <= '9') { ret = ret * 10 + (c - '0'); } ret *= sgn; return 1; } inline void _fprint(int x) { if (x > 9) _fprint(x / 10); putchar(x % 10 + '0'); } */ bitset<N> reg[22]; bitset<N> ret; int main() { int n; while (scanf("%d", &n) != EOF) { //init for (int i = 0; i < 22; i++) { reg[i].reset(); } ret.reset(); int sz = 0, x; //_fscan(sz); for (int i = 0; i < n; i++) { //_fscan(sz); scanf("%d", &sz); for (int j = 0; j < sz; j++) { //_fscan(x); scanf("%d", &x); //cout << x << endl; reg[x].set(i); } } getchar(); gets(s); //cout << s << endl; int len = strlen(s); for (int i = 0; i < len; i++) { ret <<= 1; ret[0] = 1; //cout << ret << endl; ret &= reg[s[i] - '0']; //cout << ret << endl; if (ret[n - 1] == 1) { char tmp = s[i + 1]; s[i + 1] = '\0'; puts(s + i + 1 - n); s[i + 1] = tmp; } } } return 0; }