[补漏]shift&算法
作者:互联网
- 题意:regular number
给你一个字符串,要你输出所有(每位都符合要求的)子串,输入时告诉你每位只能填的数集。 - 思路:
bitsetc[x]存每个数字可以存在的字符串位的二进制集合。(如3可以在字符串第0,3,5出现则为:101001)
bitsetdp第i位表示当前位开始往前i位是否合法。
dp就每次左移再&上c[当前字符],感觉非常地合理 - 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
const int M=5e6+5;
bitset<N>c[N],dp;
char s[M];
string ans;
int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) {
int x,cc;
scanf("%d",&cc);
for(int j=1;j<=cc;j++) {
scanf("%d",&x);
c[x][i]=1;
}
}
scanf("%s",s);
for(int i=0,sz=strlen(s);i<sz;i++) {
(dp<<=1)[0]=1;
dp&=c[s[i]-'0'];
if(dp[n-1]) {
for(int j=i-n+1;j<=i;j++) {
ans+=s[j];
}
ans+='\n';
}
}
printf("%s",ans.c_str());
return 0;
}
标签:补漏,const,int,shift,每位,算法,字符串,bitsetc,dp 来源: https://www.cnblogs.com/bestime/p/15577755.html