2018年10月7日提高组模拟赛 T1 试卷

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82958927

大意

给定 n n 个长度为 m m 的字符串 ,现在要从中任意一串选择一些子串使得这些子串与其它对应的字符串位至少有 k k 对不同


思路

由于 m m 很小,所以我们直接直接枚举所有的选择状态,再与其它串比较看看是否满足要求,为了加速比较的时间,使用二进制状态压缩,这样就可以实现 O ( 1 ) O(1) 比较,达到AC的目的了!


代码

#include<cstdio>
#include<cstring>
using namespace std;int t,n,m,k,now,ans,a[1001],v[1024];
inline int read()
{
	char c;int d=1,f=0;
	while(c=getchar(),c<48||c>57)if(c=='-')d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),c>47&&c<58)f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
inline void write(register int x){if(x>9)write(x/10);putchar(x%10+48);return;}
signed main()
{
	t=read();
	while(t--)
	{
		n=read();m=read();k=read();ans=0;memset(a,0,sizeof(a));
		for(register int i=1;i<=n;getchar(),i++) for(register int j=1;j<=m;j++) a[i]=(a[i]<<1)+getchar()-65;//状态压缩
		for(register int s=0;s<(1<<m);s++)
		{
			now=0;
			memset(v,0,sizeof(v));
			for(register int i=1;i<=n;i++)
			{
				v[a[i]&s]++;
				now+=i-v[a[i]&s];//若相同没有影响,不同的话数量自然会+1
			}
			if(now>=k) ans++;//判断是否有k对
		}
		write(ans);putchar(10);//输出
	}
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82958927