申明:本蒟蒻只是好奇一下
对字符串的处理与操作是程序设计中永恒的主题之一,也是一项很重要的基本功。你对字符串熟悉吗?
给你 n(1≤n≤20) 个字符串 (1≤字符串长度≤2000),所有的字符串中最多包含 A 到 N 这 14 种大写字母。从中选取若干个字符串,使得被选取的字符串中出现的每种字母 总数均为偶数,请编程计算最多可以选取多少个字符串?
输入文件 string.in:输入从文件中读取,输入共 n+1 行。
第 1 行一个整数 n,表示共有多少个字符串。
接下来 n 行,每行一个无序的字符串,字符串中最多包含 A 到 N 这 14 种大写字
母(不考虑行末回车等不可见字符)。
输出文件 string.out:结果输出到文件中,输出共 1 行,表示最多可以选取的字符串数
目。
1:
input:
3
AD
AD
AB
output:
2
2:
input:
5
AD
A
BA
B
D
output:
4
本人代码:
#include <bits/stdc++.h>
#define int long long
#define fin(x) freopen (x,"r",stdin)
#define fout(x) freopen (x,"w",stdout)
using namespace std;
int n,maxn;
int a[21][15];
bool pd (int b[])
{
for (int j=1;j<=14;j++)
if (b[j]%2) return false;
return true;
}
signed main ()
{
fin ("string.in");
fout ("string.out");
cin>>n;
vector<string> s(n+1);
for (int i=1;i<=n;i++) cin>>s[i];
for (int i=1;i<=n;i++)
{
for (int j=0;j<s[i].size ();j++)
a[i][s[i][j]-64]++;
}
bitset<21> st;
// int p=0;
while (!st[0])
{
// p++;
int t=n;
while (st[t]==1) st[t]=0,t--;
st[t]=1;
// cout<<"input "<<p<<':'<<st<<endl;
int b[15]={},s=0;
for (int i=1;i<=n;i++)
if (st[i])
{
for (int j=1;j<=14;j++)
b[j]+=a[i][j];
s++;
}
if (maxn>s) continue;
if (pd (b)) maxn=max (maxn,s);
}
cout<<maxn;
return 0;
}