码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 5972 Regular Number(Shift-And算法)

时间:2017-10-10 21:53:58      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:can   mes   优化   题解   problem   span   tchar   分享   number   

题目链接:hdu 5972 Regular Number

题意:

给你一个字符串,现在让你输出该字符串所有的合法子串。

合法子串定义为:对应位置的字符合法。

对应位置的合法字符会给你。

题解:

据说这是一个名字叫做Shift-And算法。其实就是一个bitset优化的字符串匹配。

这里我将它写成板子。

技术分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 namespace Shift_And{
 6     const int N=5e6+7,tyn=11;
 7     bitset<1007>s[tyn],ans;
 8     int len;char str[N];
 9     void in(int n)
10     {
11         F(i,0,tyn-1)s[i].reset();
12         ans.reset();
13         F(i,1,n)
14         {
15             int num,x;
16             scanf("%d",&num);
17             F(j,1,num)scanf("%d",&x),s[x][i]=1;
18         }
19         getchar(),gets(str+1),len=strlen(str+1);
20     }
21     void shift_and(int n)
22     {
23         F(i,1,len)
24         {
25             ans=ans<<1,ans[1]=1;
26             ans&=s[str[i]-0];
27             if(ans[n])
28             {
29                 char tp=str[i+1];
30                 str[i+1]=0;
31                 puts(str+i-n+1);
32                 str[i+1]=tp;
33             }
34         }
35         
36     }
37 }
38 
39 int main()
40 {
41     int n;
42     while(~scanf("%d",&n))
43     {
44         Shift_And::in(n);
45         Shift_And::shift_and(n);
46     }
47     return 0;
48 }
View Code

 

hdu 5972 Regular Number(Shift-And算法)

标签:can   mes   优化   题解   problem   span   tchar   分享   number   

原文地址:http://www.cnblogs.com/bin-gege/p/7647629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!