A題ios
分析:暴力ide
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 }
B題spa
分析:求不一樣set的個數,同一個set的元素必須相同,並且是同一行,同一列的。因此對每行,每列,求有多少個0,多少個1,而後集合個數位(2^k-1),最後全部的單個元素都被算了兩次,因此最後結果在減去n*mcode
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 }