HDU 5972 Regular Number(字符串shift - and算法)
题目链接 HDU5972
2016 ACM/ICPC 大连区域赛 B题
我们预处理出$b[i][j]$,$b[i][j] = 1$的意义是数字$i$可以放在第$j$位。
然后就开始这个匹配的过程。
假设字符串第一位下标从$1$开始
我们每一次处理的子串为$s[i-n+1]$,$s[i-n+2]$, $s[i-n+3]$, ..., $s[i]$
$ans[k] = 1$的含义是 $s[i-k+1], s[i-k+2], s[i-k+3], ..., s[i]$这k位可以与$t[1], t[2], t[3], t[4],..., t[k]$匹配
所以当$ans[n] = 1$的时候我们就可以输出当前这个子串
其中$t[]$表示输入的那张表。
每次处理的时候,我们先把$ans$往右移动一位,然后把$ans[1]$设成$1$.
但是这样是不够的,这相当于把原来那个子串的最前面那位去掉了,我们还要加入最高位。
所以这个时候的$ans$还要和$b[num]$进行与运算。($num$为新的最高位)
于是这样一位位处理过去就可以了。
用bitset优化,输出的时候用字符串输出,不然会超时。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 5000010;
const int M = 1002; bitset <M> b[11];
int n;
char s[N]; int main(){ while (~scanf("%d", &n)){
rep(i, 0, 9) b[i].reset();
rep(i, 0, n - 1){
int x;
scanf("%d", &x);
rep(j, 1, x){
int y;
scanf("%d", &y);
b[y][i] = 1;
}
} scanf("%s", s);
bitset <M> ans;
for (int i = 0; s[i]; ++i){
ans <<= 1;
ans[0] = 1;
ans &= b[s[i] - '0'];
if (ans[n - 1]){
char tmp = s[i + 1];
s[i + 1] = '\0';
puts(s + i - n + 1);
s[i + 1] = tmp;
}
}
}
return 0;
}
HDU 5972 Regular Number(字符串shift - and算法)的更多相关文章
- hdu 5972 Regular Number 字符串Shift-And算法 + bitset
题目链接 题意 给定两个串\(S,T\),找出\(S\)中所有与\(T\)匹配的子串. 这里,\(T\)的每位上可以有若干(\(\leq 10\))种选择,匹配的含义是:对于\(S\)的子串的每一位, ...
- HDU 5972 Regular Number
Regular Number http://acm.hdu.edu.cn/showproblem.php?pid=5972 题意: 给定一个字符串,求多少子串满足,子串的第i位,只能是给定的数(小于等 ...
- HDU 5972 Regular Number(ShiftAnd+读入优化)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5972 [题目大意] 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串 ...
- Regular Number 字符串匹配算法 Shift_and
Using regular expression to define a numeric string is a very common thing. Generally, use the shape ...
- HDU - 1711 A - Number Sequence(kmp
HDU - 1711 A - Number Sequence Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1 ...
- mean shift聚类算法的MATLAB程序
mean shift聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. mean shift 简介 mean shift, 写的 ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- 字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)
在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...
- hdu 2665 Kth number
划分树 /* HDU 2665 Kth number 划分树 */ #include<stdio.h> #include<iostream> #include<strin ...
随机推荐
- phpstudy2016+phpstorm2017-3+xdebug+chrome
1. 勾选Xdebug 后 phpstudy 会自动重启服务 [XDebug] xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" ...
- Struts2和Spring MVC 区别 今天面试被问到了
虽然说没有系统的学习过Spring MVC框架, 但是工作这么长时间, 基本上在WEB层使用的都是Spring MVC, 自己觉得Struts2也是一个不错的WEB层框架, 这两种框架至今自己还未有比 ...
- 使用Github第一节
学习Github 1.目的: 借助github托管代码 2.基本概念(1): 仓库(Repository) 仓库用来存放项目代码,每个项目对应一个仓库,多个项目则对应多个仓库 收藏(Start) 收藏 ...
- writing a usb driver(在国外的网站上复制下来的)
Writing a Simple USB Driver From Issue #120April 2004 Apr 01, 2004 By Greg Kroah-Hartman in Soft ...
- bash函数定义/使用/传参…
函数:function, 功能 过程式编程,代码重用 模块化编程 简洁 语法: function f_name { ...
- Android开发工具——Android Studio调试技巧
.调试的两种方式 到目前,调试的相关基础我们已经介绍完了,但是不少同学对Android Studio中这两个按钮感到困惑:Debug和Attach process. 这里我们就简单介绍一下这两者的区别 ...
- Python虚拟机中的一般表达式(三)
其他一般表达式 在前两章:Python虚拟机中的一般表达式(一).Python虚拟机中的一般表达式(二)中,我们介绍了Python虚拟机是怎样执行创建一个整数值对象.字符串对象.字典对象和列表对象.现 ...
- Notepad++ WebEdit插件
虽然PHP的IDE有很多,但是,我还是比较喜欢用Notepad++这款编辑器,因为比较轻量级,而且用起来比较顺手. 但是最近在改别人写的代码的时候,经常要在选定的php前后插入<?php ?& ...
- 【转】基于 Apache 在本地配置多个虚拟主机
如何使用 Apache 在本地配置出多个虚拟主机呢?而且使用不同的“域名”来访问本地不同的站点呢? 一般情况下,咱们都使用 localhost 来访问本机上的服务器,在我们的 C:/WINDOWS/s ...
- Selenium WebDriver- 通过源码中的关键字找到我们要操作的句柄,用于多个窗口之间切换
#encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...