[HDU-5972] [Problem B](16亚洲区域赛大连站)bitset优化(shiftand算法)
2017-06-06 10:51
537 查看
题意:输入N ,表示有一个长为N的子串,接下来N行,每行输入ai 和ai个数,表示有ai个数,表示子串第i个字符为ai个数中的一个,也就是这个子串的正则式,然后输入一个主串,要求输出这个主串中包含的所有的子串。
思路:使用bitset<N> b[10] ,b[i][j]表示值为i的数可以出现在子串的那些位置,即下标,那么对主串进行遍历 i=0:len-1 。另外定义一个变量bitset<N> ans ,每次先将ans左移一位,然后将最低位置1,然后令k=当前输入的数,将ans=ans&b[k], 如果当前ans[N-1]==1,那么主串s[i-N+1]~s[i]就是合法子串,输出;
思路:使用bitset<N> b[10] ,b[i][j]表示值为i的数可以出现在子串的那些位置,即下标,那么对主串进行遍历 i=0:len-1 。另外定义一个变量bitset<N> ans ,每次先将ans左移一位,然后将最低位置1,然后令k=当前输入的数,将ans=ans&b[k], 如果当前ans[N-1]==1,那么主串s[i-N+1]~s[i]就是合法子串,输出;
bitset<1005>b[11]; bitset<1005>ans; char s[5000005]; int main() { int n; while(cin>>n) { for(int i=0;i<10;i++) b[i].reset(); for(int i=0;i<n;i++) { int t; scanf("%d",&t); for(int j=1;j<=t;j++) { int k; scanf("%d",&k); b[k].set(i); } } getchar(); gets(s); ans.reset(); int len = strlen(s); for(int i=0;i<len;i++) { ans<<=1; ans.set(0); ans&=b[s[i]-'0']; if(ans[n-1]==1) { char tmp = s[i+1]; s[i+1] = 0; puts(s+i+1-n); s[i+1] = tmp; } } } return 0; }
相关文章推荐
- hdu 5975 树状数组原理题(16亚洲区域赛大连站)
- HDU 5972 Regular Number Bitset优化字符串匹配
- hdu5972 快速匹配bitset优化(shiftand算法)2016ACM/ICPC亚洲区大连站
- 2016年ACM/ICPC 亚洲区域赛 大连站 1011 Weak Pair(现HDU 5877) 树状数组离散化+dfs
- hdu 5972 Regular Number (bitset优化匹配) 2016大连现场赛
- [HDU-5979] [Problem I]水题(16大连站)计算几何
- HDU 4282 A very hard mathematic problem(暴力优化)
- Hdu 2923 MAX Average Problem (DP_斜率优化)
- hdu 2993 MAX Average Problem(DP+斜率优化)
- hdu 2993 MAX Average Problem 动态规划 斜率优化
- zoj 3733 (hdu 4798) Skycity (2013 亚洲区域赛 长沙站 H)
- HDU 2993 MAX Average Problem(斜率优化入门+单调队列)
- hdu 2993 MAX Average Problem 斜率优化DP
- HDU MAX Average Problem(斜率优化DP)
- hdu 4771 (2013acmicpc 亚洲区域赛杭州站 B)
- hdu 4778 Gems Fight!(2013acmicpc亚洲区域赛杭州站 I)
- HDU 2993 MAX Average Problem(斜率优化DP)
- hdu 2993 MAX Average Problem(DP+斜率优化)
- HDU 2993 MAX Average Problem【斜率优化dp】
- HDU 4474 HDOJ Yet Another Multiple Problem 2012ACM亚洲赛成都赛区K题