版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82958927
大意
给定 个长度为 的字符串 ,现在要从中任意一串选择一些子串使得这些子串与其它对应的字符串位至少有 对不同
思路
由于 很小,所以我们直接直接枚举所有的选择状态,再与其它串比较看看是否满足要求,为了加速比较的时间,使用二进制状态压缩,这样就可以实现 比较,达到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);//输出
}
}