记录编号 136679 评测结果 AAAAAAAAAA
题目名称 [東方S3] 稗田阿求 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2014-11-03 16:39:25 内存使用 0.32 MiB
显示代码纯文本
/*
PROG: akyuu
AUTH: Nettle      <-maker
STAT: AC
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned long long LL;
struct ORDER{
	int ch,cnt;
	bool operator<(const ORDER&x)const
	{
		return (cnt>x.cnt)||(cnt==x.cnt&&ch>x.ch);
	}
}order[30];
char tp[110];
int N,M,NowMax;
bool used[30];
LL del[30][30];
int Count(LL x)
{
    x=((x&0xAAAAAAAAAAAAAAAALL)>>1)+(x&0x5555555555555555LL);
    x=((x&0xCCCCCCCCCCCCCCCCLL)>>2)+(x&0x3333333333333333LL);
    x=((x&0xF0F0F0F0F0F0F0F0LL)>>4)+(x&0x0F0F0F0F0F0F0F0FLL);
    x=((x&0xFF00FF00FF00FF00LL)>>8)+(x&0x00FF00FF00FF00FFLL);
    x=((x&0xFFFF0000FFFF0000LL)>>16)+(x&0x0000FFFF0000FFFFLL);
    x=((x&0xFFFFFFFF00000000LL)>>32)+(x&0x00000000FFFFFFFFLL);
    return x;
}
void DFS(int dep, LL rest)
{
    int Tp=Count(rest);
    if(Tp<=NowMax)return;
    if(!order[dep].cnt)
    {
        if(Tp>NowMax)NowMax=Tp;
        return;
    }
    for(int i=1;i<=N;i++)
    if(!used[i])
    {
    	used[i]=true;
        DFS(dep+1,rest&(~del[ order[dep].ch ][i]));
        used[i]=false;
    }
    return;
}
int main()
{
    freopen("akyuu.in","r",stdin);
    freopen("akyuu.out","w",stdout);
    int num,ch;
    LL t=1;
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%s",tp+1);
        for(int j=1;tp[j];j++)
        {
            ch=tp[j]-'A'+1;
            order[ch].cnt++;
            scanf("%d",&num);
            for(int k=1;k<=N;k++)
            {
                if(k!=num)del[ch][k]|=t;
                if(k!=ch)del[k][num]|=t;
            }
        }
        t<<=1;
    }
    for(int i=1;i<=N;i++) order[i].ch=i;
    sort(order+1,order+N+1);
    DFS(1,t-1);
    printf("%d\n",NowMax);
	return 0;
}