1. 程式人生 > >HDU-5972 Regular Number

HDU-5972 Regular Number

題意: 給定一個正則表示式, 求一個字串中所有的匹配。(字串都是數字字元) 分析: 題目中的正則表示式給定的格式是:給定這個匹配的位數, 然後給定每個位數上的可以匹配的數字。在這裡引入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;
}