关于更快的做法
  • 板块学术版
  • 楼主__hjwucj__
  • 当前回复10
  • 已保存回复10
  • 发布时间2024/5/6 20:13
  • 上次更新2024/5/6 22:01:04
查看原帖
关于更快的做法
1021663
__hjwucj__楼主2024/5/6 20:13

申明:本蒟蒻只是好奇一下

题目(偶数字符串(string))

【问题描述】

对字符串的处理与操作是程序设计中永恒的主题之一,也是一项很重要的基本功。你对字符串熟悉吗?

给你 n(1≤n≤20)n(1≤n≤20) 个字符串 (1≤字符串长度≤2000)(1≤字符串长度≤2000),所有的字符串中最多包含 AA 到 NN 这 14 种大写字母。从中选取若干个字符串,使得被选取的字符串中出现的每种字母 总数均为偶数,请编程计算最多可以选取多少个字符串?

【输入数据】

输入文件 string.in:输入从文件中读取,输入共 n+1n+1 行。 第 1 行一个整数 nn,表示共有多少个字符串。 接下来 nn 行,每行一个无序的字符串,字符串中最多包含 AA 到 NN 这 14 种大写字 母(不考虑行末回车等不可见字符)。

【输出数据】

输出文件 string.out:结果输出到文件中,输出共 11 行,表示最多可以选取的字符串数 目。

样例

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;
}
2024/5/6 20:13
加载中...