hdu 5972 Regular Number(Shift-And算法)
阿新 • • 發佈:2017-10-10
getc problem target div view tar ret open 鏈接
題目鏈接: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+7View Code,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 }
hdu 5972 Regular Number(Shift-And算法)