#20369: 測資問題 ?


hshua (hshua)

學校 : 新北市立林口高級中學
編號 : 52506
來源 : [125.228.147.181]
最後登入時間 :
2024-05-02 20:52:39
e706. 12820 - Cool Word -- UVA | From: [220.133.124.236] | 發表日期 : 2020-01-11 11:44

#include <bits/stdc++.h>
using namespace std;
int n, cnt[27];
char s[35];
//-------------------------------------------------
bool check(){
  map<int, int> M;
  for(int i=0; i<26; i++){
    if(cnt[i]!=0){
      if(!M[cnt[i]]) M[cnt[i]] = i; //計數值對應字母序
      else return false;
    }
  }
  return true;
}
//-------------------------------------------------
int main(){
  int Case=1;
  while(~scanf("%d", &n)){
    int total=0;
    while(n--){
      scanf("%s", s);
      cnt[27]={};
      for(int i=0; i<strlen(s); i++)  cnt[s[i]-'a']++;
      //cout<< (check() ? "YES\n" : "NO\n");
      if(check()) total++;
    }
    printf("Case %d: %d\n", Case++, total);
  }
}

 

錯誤訊息------------------------------------------------------------

#0: 50% WA (line:2)

您共輸出 1 行。

#1: 50% WA (line:2)

您共輸出 1 行。

不知何故??

 

 
#21651: Re:測資問題 ?


rsj00008 (二信008)

學校 : 基隆市私立二信高級中學
編號 : 49436
來源 : [210.71.40.107]
最後登入時間 :
2024-05-03 11:00:37
e706. 12820 - Cool Word -- UVA | From: [220.137.23.169] | 發表日期 : 2020-07-01 22:12


//-------------------------------------------------
int main(){
  int Case=1;
  while(~scanf("%d", &n)){
    int total=0;
    while(n--){
      scanf("%s", s);
      cnt[27]={};                               <<======== 這行並沒有把 cnt[]陣列清為0
      for(int i=0; i<strlen(s); i++)  cnt[s[i]-'a']++;
      //cout<< (check() ? "YES\n" : "NO\n");
      if(check()) total++;
    }
    printf("Case %d: %d\n", Case++, total);
  }
}

錯誤訊息------------------------------------------------------------

 
另請用下列測資試一下
範例輸入:
2
ada
bbacccd
2
illness
a
5
aaaabbbccd
aabb
abcabc
aabbccdd
abcaba
範例輸出 :
Case 1: 1
Case 2: 0
Case 3: 2 



 
#21652: Re:測資問題 ?


rsj00008 (二信008)

學校 : 基隆市私立二信高級中學
編號 : 49436
來源 : [210.71.40.107]
最後登入時間 :
2024-05-03 11:00:37
e706. 12820 - Cool Word -- UVA | From: [220.137.23.169] | 發表日期 : 2020-07-01 22:43

//-------------------------------------------------
bool check(){
  map<int, int> M;
  for(int i=0; i<26; i++){
    if(cnt[i]!=0){
      if(!M[cnt[i]]) M[cnt[i]] = i;   <<=== 不應該設為0, 但有可能i=0
      else return false;
    }
  }
  return true;
}

 

 

===============

假設字串為 aabb應該傳回 false,但你的 check()會傳回 true

因為 cnt[0]=2 , cnt[1]=2 

當i=0,  M[2]==0 時應設為非0值, 但你的程式中又設為 M[2]=i

然後 i=1時, 檢查M[2]==0 又設定 M[2] = 1,並沒有傳回 false

---------

其實只要檢查 cnt[i]是否出現過,用set即可,unordered_set<int> M 會更快吧!
bool check()程式碼類似如下
...
   if( cnt[i] )
   {
       if( M.count(cnt[i]) ) return 0;
       M.insert( cnt[i] );
   }
...
return(M.size()>1);  //最少2種以上

 

 
ZeroJudge Forum