Java教程

[补漏]shift&算法

本文主要是介绍[补漏]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;
}
这篇关于[补漏]shift&算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!