几个需要注意的套路:
1、给你N个东西,每个东西可选可不选,那就是2^N枚举,如果N比较小可以用一个int的每个位来表示是否选取这个物品,即位向量。
如果2^N枚举,那么很有可能时间不够,因此可以使用中途相遇法,再利用map或者set,可以把时间复杂度从O(2^N)降到O(2^(N/2)logN)。
2、如果要判断奇偶,特别是位向量,那么亦或运算将会是一个非常高效的方法。
代码
#include<bits/stdc++.h>
#define maxn 30
using namespace std;
int N;
char str[maxn][maxn];
int A[maxn];
map<int,int>tb;
int ct(int x)
{
return x==0?0:ct(x>>1)+(x&1);
}
int main()
{
while(scanf("%d",&N)==1&&N)
{
tb.clear();
for(int i=0;i<N;i++)
{
scanf("%s",str[i]);
A[i]=0;
int l=strlen(str[i]);
for(int j=0;j<l;j++)
A[i]^=(1<<(str[i][j]-'A'));
}
int n1&#