C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の各パズルの有効な単語の数


パズルの文字列があるとすると、次の両方の条件が有効な場合、単語は有効です-

  • 単語にはパズルの最初の文字が含まれています。

  • 単語の各文字について、その文字はパズルの中にあります。

パズルが「abcdefg」のようなものである場合、有効な単語は「顔」、「キャベツ」などであるという例を考えてみましょう。ただし、一部の無効な単語は、「a」がないため「強化」され、パズルに存在しない「s」があるため「ベース」になります。

答えのリストを見つける必要があります。ここで、answer [i]は、パズルパズル[i]に関して有効な特定の単語リストの単語の数です。

したがって、入力がwords =["aaaa"、 "asas"、 "able"、 "ability"、 "actt"、 "actor"、 "access"]の場合、puzzles =["aboveyz"、 "abrodyz"、 "abslute"、 "absoryz"、 "actresz"、 "gaswxyz"]の場合、出力は[1,1,3,2,4,0]になり、 "aboveyz"の有効な単語の1つとして: "aaaa"、one 「abrodyz」の有効な単語:「aaaa」、「abslute」の3つの有効な単語:「aaaa」、「asas」、「able」、「absoryz」の2つの有効な単語:「aaaa」、「asas」、4つの有効な単語「actresz」の場合:「aaaa」、「asas」、「actt」、「access」であり、「gaswxyz」の有効な単語がないため、リスト内のどの単語にも文字「g」が含まれていません。

これを解決するには、次の手順に従います-

  • 関数getMask()を定義します。これにはsがかかります

  • マスク:=0

  • 初期化i:=0の場合、i

    • mask:=mask OR 2 ^(s [i]-'a'のASCII)

  • リターンマスク

  • メインの方法から、次のようにします-

  • 配列を定義します

  • 1つのマップを定義するm

  • 初期化i:=0の場合、i

    • 単語:=w [i]

    • マスク:=0

    • 初期化j:=0の場合、j <ワードのサイズの場合、更新(jを1増やします)、do-

      • mask:=mask OR getMask(w [i])

    • (m [マスク]を1増やします)

  • 初期化i:=0の場合、i

    • 単語:=p [i]

    • マスク:=getMask(word)

    • 最初:=2 ^(word [0]-'a'のASCII)

    • 現在:=マスク

    • temp:=0

    • 現在>0の場合、実行-

      • current&firstがゼロ以外の場合、-

        • current:=(current-1)AND mask

    • ansの最後にtempを挿入します

  • ansを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
typedef long long int lli;
class Solution {
   public:
   lli getMask(string s){
      lli mask = 0;
      for(int i =0;i<s.size();i++){
         mask|= 1<<(s[i]-'a');
      }
      return mask;
   }
   vector<int> findNumOfValidWords(vector<string>& w, vector<string>& p) {
      vector <int> ans;
      map <lli, lli > m;
      for(int i =0;i<w.size();i++){
         string word = w[i];
         lli mask = 0;
         for(int j =0;j<word.size();j++){
            mask|= getMask(w[i]);
         }
         m[mask]++;
      }
      for(int i = 0; i<p.size();i++){
         string word = p[i];
         lli mask = getMask(word);
         lli first = 1<<(word[0]-'a');
         lli current = mask;
         lli temp = 0;
         while(current>0){
            if(current & first)temp+=m[current];
            current = (current-1)&mask;
         }
         ans.push_back(temp);
      }
      return ans;
   }
};
main(){
   Solution ob;
   vector<string> v = {"aaaa","asas","able","ability","actt","actor","access"};
   vector<string> v1 = {"aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"};
   print_vector(ob.findNumOfValidWords(v,v1));
}

入力

{"aaaa","asas","able","ability","actt","actor","access"},
{"aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"}

出力

[1, 1, 3, 2, 4, 0, ]

  1. 16進数から10進数のC++プログラム

    16進数を入力として指定すると、タスクは指定された16進数を10進数に変換することです。 コンピューターの16進数は16を底とし、10進数は10を底とし、0〜9の値で表されますが、16進数は0〜15から始まる数字で、10はA、11はB、12はC、 Dとして13、Eとして14、Fとして15。 16進数を10進数に変換するには、次の手順に従います- 余りから右から左に数字を抽出し、それを0から始まる累乗で乗算し、(桁数)–1まで1ずつ増やします。 16進数から2進数に変換する必要があるため、8進数の基数は16であるため、累乗の基数は16になります。 指定された入力の桁にベースとパワーを掛け

  2. C ++の複素数のacos()関数?

    ここでは、複素数のacos()メソッドを確認します。複素数は、複素ヘッダーファイルを使用して使用できます。そのヘッダーファイルには、acos()関数も含まれています。これは通常のacos()関数の複雑なバージョンです。これは、複素数の複素アークコサインを見つけるために使用されます。 この関数は、入力パラメーターとして複素数を取り、出力としてアークコサインを返します。アイデアを得るための1つの例を見てみましょう。 例 #include<iostream> #include<complex> using namespace std; main() {   &nb