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("");
}
}