hdu5972(bitset優化匹配)
阿新 • • 發佈:2018-12-30
思路:bitset優化匹配(具體看程式碼)
#pragma GCC optimize(2) #include <cstdio> #include <cstdlib> #include <cstring> #include <bitset> #include <cmath> #include <cctype> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <queue> #include <map> #include <set> #include <sstream> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull; const ll inff = 0x3f3f3f3f3f3f3f3f; #define FOR(i,a,b) for(int i(a);i<=(b);++i) #define FOL(i,a,b) for(int i(a);i>=(b);--i) #define REW(a,b) memset(a,b,sizeof(a)) #define inf int(0x3f3f3f3f) #define si(a) scanf("%d",&a) #define sl(a) scanf("%lld",&a) #define sd(a) scanf("%lf",&a) #define ss(a) scanf("%s",a) #define mod ll(1e9+7) #define pb push_back #define eps 1e-6 #define lc d<<1 #define rc d<<1|1 #define Pll pair<ll,ll> #define P pair<int,int> #define pi acos(-1) int n,a,b; bitset<1008> bt[18],ans; char s[5000008],c; int main() { cin.tie(0); cout.tie(0); while(cin>>n) { FOR(i,1,n) { si(a); FOR(j,1,a) si(b),bt[b].set(i); } ss(s); int l=strlen(s); ans.reset(); FOR(i,0,l-1) { ans<<=1; ans[1]=1;//表示以這一位為開頭進行匹配 ans&=bt[s[i]-'0'];//n次&運算之後這位還是1代表以這一位為開頭的長度為n的串匹配成功,因為每次位移的關係相當於與下一位再次匹配 if(ans[n]) { c=s[i+1]; s[i+1]='\0'; puts(s+i-n+1); s[i+1]=c; } } } return 0; }