AIM Tech Round 4 (Div. 2)
分析:暴力
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn=100+10; 7 int vis[maxn],n; 8 string s; 9 int main() 10 { 11 cin>>s; 12 cin>>n; 13 int len=s.length(); 14 for(int i=0;i<len;i++){ 15 vis[s[i]-'a']++; 16 } 17 if(len<n){ 18 cout<<"impossible"<<endl; 19 }else{ 20 int num=0; 21 for(int i=0;i<30;i++){ 22 if(vis[i]) 23 num++; 24 } 25 if(num>=n) 26 cout<<"0"<<endl; 27 else 28 cout<<(n-num)<<endl; 29 } 30 return 0; 31 }
分析:求不同set的个数,同一个set的元素必须相同,而且是同一行,同一列的。所以对每行,每列,求有多少个0,多少个1,然后集合个数位(2^k-1),最后所有的单个元素都被算了两次,所以最后结果在减去n*m
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 #include "vector" 6 #include "cmath" 7 using namespace std; 8 const int maxn=100+10; 9 int n,m; 10 int a[maxn][maxn]; 11 struct Node 12 { 13 int zero,one; 14 }; 15 vector<Node>p; 16 int main() 17 { 18 cin>>n>>m; 19 for(int i=1;i<=n;i++) 20 for(int j=1;j<=m;j++) 21 cin>>a[i][j]; 22 for(int i=1;i<=n;i++){ 23 int num0=0,num1=0; 24 for(int j=1;j<=m;j++){ 25 if(a[i][j]==1) 26 num1++; 27 else 28 num0++; 29 } 30 Node e; 31 e.zero=num0,e.one=num1; 32 p.push_back(e); 33 } 34 for(int j=1;j<=m;j++){ 35 int num0=0,num1=0; 36 for(int i=1;i<=n;i++){ 37 if(a[i][j]==1) 38 num1++; 39 else 40 num0++; 41 } 42 Node r; 43 r.zero=num0,r.one=num1; 44 p.push_back(r); 45 } 46 long long res=0; 47 for(int i=0;i<p.size();i++){ 48 res+=(long long)pow(2,p[i].zero)-(long long)1; 49 res+=(long long)pow(2,p[i].one)-(long long)1; 50 } 51 res-=(n*m); 52 cout<<res<<endl; 53 return 0; 54 }