列表

详情


NC50448. 德育分博弈政治课

描述

德育分学长最近玩起了骰子。他玩的骰子不同,他的骰子有六面,每面上写着一个 1 到 9 之间的数字,且六个面上的数字互不相同。现在他手上有 n 个这样的骰子。政治课学长为了在小学妹面前树立威信,决定难为一下德育分。他向德育分提出了 Q 个问题,每个问题是一个字符串,且只含有‘1’~‘9’之间的字符,若德育分可以用他手上的骰子组成这个字符串,则这一回合德育分获胜,否则政治课获胜。若字符串长度为 L,则德育分从他的骰子中选出 L 个,选定每个骰子朝上的面,以一定顺序排列后恰好是这个字符串,则定义为可以组成这个字符串。 

输入描述

第一行输入 n,Q。
接下来 n 行,每行输入一个长度为 6 的字符串,每个字符都在‘1’~‘9’。
接下来 Q 行,每行一个字符串,每个字符都在‘1’~‘9’。且 Q 个字
符串的总长度不超过 2000000。
1<=n<=500000,1<=Q<=100。

输出描述

对于每一回合,若德育分获胜,输出“dyf”。
若政治课获胜,输出“zzk”。

示例1

输入:

3 3
137628
987654
123456
288
2288
333

输出:

dyf
zzk
zzk

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 259ms, 内存消耗: 736K, 提交时间: 2019-10-29 19:17:26

#include<bits/stdc++.h>
using namespace std;
int n,q,m;
int cnt[1000001];
int   w[1000001];
char  s[1000001];
int main()
{
    cin>>n>>q;
    for(int i=0;i<n;i++)
    {
        int a=0;
        cin>>s;
        for(int j=0;j<6;j++)
        {
            a|=1<<(s[j]-'1');
        }
        cnt[a]++;
    }
    for(int i=0;i<512;i++)
    {
        for(int j=0;j<512;j++)
        {
            if(i&j)
            {
                w[i]+=cnt[j];
            }
        }
    }
    while(q--)
    {
        int c[10]={};
        cin>>s;
        m=strlen(s);
        bool dyf=true;
        for (int i = 0; i < m; i++)
        {
            c[s[i] - '1']++;
        }
        for(int i=0;i<512;i++)
        {
            int now=0;
               for(int j=0;j<9;j++)
               {
                     if(i>>j&1)
                     {
                        now+=c[j];
                     }
               }
               if(w[i]<now)
               {
                dyf=false;
               }
             
        }    puts(dyf ? "dyf" : "zzk");
    }
}

C++11(clang++ 3.9) 解法, 执行用时: 257ms, 内存消耗: 612K, 提交时间: 2019-10-14 11:24:43

#include<bits/stdc++.h>
using namespace std;
int n,q,m;
int cnt[1000001];
int   w[1000001];
char  s[1000001];
int main()
{
	cin>>n>>q;
	for(int i=0;i<n;i++)
	{
		int a=0;
		cin>>s;
		for(int j=0;j<6;j++)
		{
			a|=1<<(s[j]-'1');
		}
		cnt[a]++;
	}
	for(int i=0;i<512;i++)
	{
		for(int j=0;j<512;j++)
		{
			if(i&j)
			{
				w[i]+=cnt[j]; 
			}
		}
	}
	while(q--)
	{
	    int c[10]={};
		cin>>s;
		m=strlen(s);
		bool dyf=true;
		for (int i = 0; i < m; i++) 
		{
            c[s[i] - '1']++;
        }
		for(int i=0;i<512;i++)
		{
		   	int now=0;
		   	   for(int j=0;j<9;j++)
			   {
			   	     if(i>>j&1)
					 {
					 	now+=c[j];
					 }
			   }
			   if(w[i]<now)
			   {
			   	dyf=false;
			   }
		   	
		}	 puts(dyf ? "dyf" : "zzk");
	} 
} 

上一题