首页 > HDU 5972 Regular Number(ShiftAnd+读入优化)

HDU 5972 Regular Number(ShiftAnd+读入优化)

 

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5972

 

【题目大意】

  给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串的长度为n,并且第i个字符需要在给定的字符集合Si中 

 

【题解】

  利用ShiftAnd匹配算法。

  bt[i]表示字符i允许在哪些位置上出现,我们将匹配成功的位置保存在dp中,那么就可以用dp[i]=dp[i-1]<<1&bt[s[i]]来更新答案了

  利用滚动数组和bitset可以来优化这样的运算,当一个位置的匹配在更新的过程中没有丢失,

  即始终在特定模式中直到定长,那么这个位置就是成功匹配位,复杂度为O(nm/64)

  由于输入的数据量庞大,因此需要读入和输出优化。

  终于AC了,补上大连赛区的遗憾。

 

【代码】

#include 
#include 
#include 
using namespace std;
const int M=1010,N=5000010,U=256;
bitset dp[2],bt[U];
int n,m,x,id[U],cnt,l;
char s[N];
namespace fastIO{#define BUF_SIZE 100000#define OUT_SIZE 1000000bool IOerror=0;inline char nc(){static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;if(p1==pend){p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin);if (pend==p1){IOerror=1;return -1;}}return *p1++;}inline bool blank(char ch){return ch==' '||ch=='
'||ch=='
'||ch=='	';}inline int read(char *s){char ch=nc();for(;blank(ch);ch=nc());if(IOerror)return 0;for(;!blank(ch)&&!IOerror;ch=nc())*s++=ch;*s=0;return 1;}inline int RI(int &a){char ch=nc(); a=0;for(;blank(ch);ch=nc());if(IOerror)return 0;for(;!blank(ch)&&!IOerror;ch=nc())a=a*10+ch-'0';return 1;}struct Ostream_fwrite{char *buf,*p1,*pend;Ostream_fwrite(){buf=new char[BUF_SIZE];p1=buf;pend=buf+BUF_SIZE;}void out(char ch){if (p1==pend){fwrite(buf,1,BUF_SIZE,stdout);p1=buf;}*p1++=ch;}void flush(){if (p1!=buf){fwrite(buf,1,p1-buf,stdout);p1=buf;}}~Ostream_fwrite(){flush();}}Ostream;inline void print(char x){Ostream.out(x);}inline void println(){Ostream.out('
');}inline void flush(){Ostream.flush();}char Out[OUT_SIZE],*o=Out;inline void print1(char c){*o++=c;}inline void println1(){*o++='
';}inline void flush1(){if (o!=Out){if (*(o-1)=='
')*--o=0;puts(Out);}}struct puts_write{~puts_write(){flush1();}}_puts;
};
void init(){cnt=0;for(int i='0';i<='9';i++)id[i]=cnt++;
}
void ShiftAnd(int n,int m){int cur=1,f=0;dp[0].reset(); dp[0].set(0);for(int i=1;i<=n;i++,cur^=1){dp[cur]=dp[cur^1]<<1&bt[id[s[i]]];dp[cur].set(0);if(dp[cur][m]){for(int j=i-m+1;j<=i;j++)fastIO::print(s[j]);fastIO::println();}}
}
int main(){   //freopen("demo.in","r",stdin);//freopen("demo.out","w",stdout);init();while(fastIO::RI(m)){ for(int i=0;i

  

转载于:https://www.cnblogs.com/forever97/p/hdu5972.html

更多相关:

  • $dp$。 这道题最关键的是这句话: 跳出思维局限大胆设状态,设$f_{x, i, j}$表示从$x$到根要经过$i$条公路,$j$条铁路的代价,那么对于一个叶子结点,有$f_{x, i, j} = c_x * (a_x + i) * (b_x + j)$,对于内部结点,有转移:   $f_{x, i, j} = min(f_{lso...

  • 合作者:201631062327,201631062128码云地址:https://gitee.com/LIUJIA6/WordCount3 一:项目说明 本次项目是在上次作业WorldCount的基础上,利用结对编程的思想,完成对WorldCount项目的功能扩展 -s 递归处理目录下符合条件的文件。(实现)-a 返回更复杂的数据(...

  • Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 1、2 拼凑起来形成一个魔咒串 [1,2]。 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒。 例如 S=[1,2,1] 时,它的生成魔咒有 [1]、[2]、[1,2]、[2,1]、[1,2,1] 五种。S=[1,1,1] 时,它的生...

  • 首先我们可以发现如果错过了一个加油站,而继续往前走的时候没有油了,可以再假装之前经过加油站的时候加过油 于是我们维护一个大根堆,表示错过的加油站是哪些,每当没有油的时候从堆顶取出最大值加上去即可   1 /**************************************************************...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • char* Reverse(char* s) {//将q指向字符串最后一个字符char* q = s ;while( *q++ ) ;q -= 2 ; //分配空间,存储逆序后的字符串。char* p = newchar[sizeof(char) * (q - s + 2)] ; char* r = p ;// 逆序存储whil...

  • 二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {"abc", "def", "ghi"}; 这种模型为二级指针的第一种内存模型,在理解的时候应该这样理解:定义了一个指针数组(char *...

  • 今天在弄一下啊小小程序的时候。报错,出现了问题。先看代码 int main(int argc, char* argv[]) {char *filename = "interface_ipset_1_1.json";char* split1 = "_";char* split2 = ".";char splitfile1[4][...

  • wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString....#include // 使用CString必须使用MFC,并且不可包含#define _AFXDLL#include us...

  • 问题的提出:设计一个用于管理朋友信息的程序。将朋友信息(年龄、姓名、电话)存放在MyFrd.dat中,从文件读出这些信息并显示,并能按姓名(要求可简化输入,如只输入姓氏便可查询)进行查询,将查询信息输出屏幕。 1 #include 2 #include 3 #include<...