【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;
}