POJ 3188暴搜

题意:
这里写图片描述
这里写图片描述
这里写图片描述

思路:
裸的暴搜 …….

但是要注意如果你不用所有的按键就能输出最优解的话一定要把所有的字母都安排到一个位置….
我的一群PE就是这么来的……

为什么写的人这么少……
这里写图片描述

// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int b,l,d,mod=10000007,vis[10000007],rec[66],tot=0,change[66],answer=0,num[10000007],ANS[66];
char s[1005][20];
void dfs(int x,int used)
{
    if(used==b)
    {
        int ans=0;
        tot++;
        for(int i=1;i<=b;i++)
            for(int j=rec[i-1]+1;j<=rec[i];j++)
                change[j]=i;
        for(int j=1;j<=d;j++)
        {
            int jy=0;
            for(int k=1;k<=s[j][0];k++)
            {
                jy=(jy*l+change[s[j][k]])%mod;
            }
            if(vis[jy]!=tot)
            {
                vis[jy]=tot;
                ans++;
            }
            else
            {
                if(num[jy]!=tot)
                {
                    num[jy]=tot;
                    ans--;
                }
            }
        }
        if(answer<=ans&&change[l]==b)
        {
            answer=ans;
            for(int i=1;i<=l;i++)
            {
                ANS[i]=change[i];
            }
        }
        return;
    }
    for(int i=x+1;i<=l;i++)
    {
        rec[used]=i;
        dfs(i,used+1);
    }
}
int main()
{
    scanf("%d%d%d",&b,&l,&d);
    rec[b]=l;
    for(int i=1;i<=d;i++){
        scanf("%s",s[i]+1);
        s[i][0]=strlen(s[i]+1);
        for(int j=1;j<=s[i][0];j++)
            s[i][j]=s[i][j]-'A'+1;
    }
    dfs(0,1);
    printf("%d\n",answer);
    for(int i=1;i<=l;i++)
    {
        printf("%c",i+'A'-1);
        if(ANS[i]!=ANS[i+1])puts("");
    }
}

这里写图片描述

posted @ 2016-08-27 14:51  SiriusRen  阅读(144)  评论(0编辑  收藏  举报