uva 1326(二进制枚举)

it2022-05-24  68

二进制枚举比较,只要出现偶数个相同字母即成立

#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const int maxn=50; int v[maxn],c[maxn],k[maxn]; int n,ans; int hh(string s) { int kk=0; for(int i=0;i<s.length();i++) kk=kk^(1<<(s[i]-'A'));//不同西姆往左移动的位数不同 return kk; } void init() { ans=0; memset(c,0,sizeof(c)); memset(v,0,sizeof(v)); string ss; for(int i=0;i<n;i++) { cin >> ss; k[i]=hh(ss); } } void dfs(int d,int s,int cnt) { if(d>=n) { if(s==0&&cnt>ans) { ans=cnt; memcpy(v,c,sizeof(v)); } return; } c[d]=0; dfs(d+1,s,cnt);//不取第d个 c[d]=1; dfs(d+1,s^k[d],cnt+1);//取第d个,如果出现相同字母则那位的二进制为0 c[d]=0; } void pput() { printf("%d\n",ans); int nn=0; for(int i=0;i<26;i++) if(v[i]) { printf("%d",i+1); nn++; if(nn!=ans) printf(" "); else printf("\n"); } } int main() { while(~scanf("%d",&n)) { init(); dfs(0,0,0); pput(); } return 0; }

 

转载于:https://www.cnblogs.com/Wangwanxiang/p/7441448.html


最新回复(0)