题意
给出n个字符串,求有多少个长度为L的字符串满足每个字符串出现至少一次。字符串仅由小写字母组成。
若方案书<=42的输出方案。
n<=10,L<=25,字符串长度<=10
分析
首先把重复和被包含的字符串去掉,建立AC自动机。
设f[i,j,k]表示在AC自动机上走了i步,走到第j个点,n个字符串的出现情况为k(k为n位二进制)的方案数。直接枚举转移即可。
输出方案数的话,注意到若字符串的某一个位不属于n个字符串中的任何一个,则方案数必然>=52,所以这必然是由n个字符串通过某种排列顺序紧凑排列后得到的。那么我们只要枚举字符串的排列顺序后按照字典序输出即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long LL;
int n,L,ch[105][26],num[105],fail[105],sz,bin[15],bor[15][15],g1,g[15],a1,len[15],rank[50],m;
queue<int> que;
char str[15][15],a[50][30];
LL f[2][105][1105];
bool vis[15],del[15];
int find(int x,int y)
{
for (int i=min(len[x],len[y]);i>=0;i--)
{
int<