版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Shift-And算法
- 用于每一位可以匹配多个字符的情况
- 使用
bitset
实现 kmp
思想寻找模式串的前缀与匹配串后缀的最大匹配长度
Regular Number
题意
模式串每位可以匹配0-9
的多个数字
输出与模式串匹配的匹配串
思路
waring :
在输入输出字符串的时候puts
和gets
会快很多
- 先用
bitset
记录每种值所在的位置
for (int i = 0; i < 10; i++)
num[i].reset();
for (int i = 1; i <= n; i++) {
int k, x;
scanf("%d", &k);
for (int j = 1; j <= k; j++) {
scanf("%d", &x);
num[x].set(i);
}
}
-
按位匹配,若有一位经过
n
次匹配为真,即成立 -
例如,对于样例
4 3 0 9 7 2 5 7 2 2 5 2 4 5 09755420524
9
第一匹配为1
,当匹配第2
位时恰好匹配9
所代表的字符串第2
位
int len = strlen(s + 1);
for (int i = 1; i <= len; i++) {
p = p << 1;
p.set(1);
p &= num[s[i] - '0'];
if (p[n]) {
char temp = s[i + 1];
s[i + 1] = '\0';
puts(s + i - n + 1);
s[i + 1] = temp;
}
}