bzoj 1559 AC自动机 + dp
思路:直接在状态图上跑dp,最后枚举一下42种一下的。。 这个枚举有点恶心。
#include<bits/stdc++.h>
#define LL long long
#define ll long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg using namespace std; const int N = + ;
const int M = 1e7 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = ; int n, m, up, top, id[N], bord[N][N];
string s[], t[];
bool vis[N]; bool cmp(const string &a, const string &b) {
return a.size() > b.size();
}
bool check(const string &a, const string &b) {
for(int i = ; i < a.size(); i++) {
if(a.substr(i, b.size()) == b) return true;
}
return false;
} int cal(const string &a, const string &b) {
int l1 = a.size(), l2 = b.size();
for(int i = min(l1, l2) - ; i >= ; i--) {
if(a.substr(l1 - i, i) == b.substr(, i)) return i;
}
return ;
} struct Ac {
int ch[N][], val[N], f[N], tot, sz, depth[N];
LL dp[][][ << ];
Ac(int sz) {this->sz = sz;}
void init() {tot = ;};
int newNode() {
tot++; f[tot] = ; val[tot] = ;
memset(ch[tot], , sizeof(ch[tot]));
return tot;
}
inline int idx(char c) {return c - 'a';}
void addStr(string &s, int id) {
int u = ;
for(int i = ; i < s.size(); i++) {
int c = idx(s[i]);
if(!ch[u][c]) ch[u][c] = newNode(), depth[ch[u][c]] = depth[u] + ;
u = ch[u][c];
}
val[u] |= << id;
}
void build() {
queue<int> que;
for(int c = ; c < sz; c++) {
int v = ch[][c];
if(!v) ch[][c] = ;
else f[v] = , que.push(v);
}
while(!que.empty()) {
int u = que.front(); que.pop();
val[u] |= val[f[u]];
for(int c = ; c < sz; c++) {
int v = ch[u][c];
if(!v) ch[u][c] = ch[f[u]][c];
else f[v] = ch[f[u]][c], que.push(v);
}
}
} void solve() {
dp[][][] = ;
for(int k = ; k < n; k++) {
for(int u = ; u <= tot; u++) {
for(int c = ; c < sz; c++) {
int v = ch[u][c];
for(int s = ; s <= up; s++) {
dp[k + ][v][s | val[v]] += dp[k][u][s];
}
}
}
} LL ans = ;
for(int u = ; u <= tot; u++)
ans += dp[n][u][up];
cout << ans << '\n'; if(ans <= ) {
memset(vis, true, sizeof(vis));
sort(s, s + m, cmp);
for(int i = ; i < m; i++)
for(int j = i + ; j < m; j++)
if(check(s[i], s[j])) vis[j] = false; for(int i = ; i < m; i++)
if(vis[i]) id[top] = top, t[top++] = s[i]; for(int i = ; i < top; i++)
for(int j = ; j < top; j++)
if(i != j) bord[i][j] = cal(t[i], t[j]); vector<string> vec;
do {
string ret = t[id[]];
for(int i = ; i < top; i++) {
int len = bord[id[i - ]][id[i]];
ret += t[id[i]].substr(len, );
}
if(ret.size() == n) vec.push_back(ret);
} while(next_permutation(id, id + top)); sort(vec.begin(), vec.end());
for(int i = ; i < vec.size(); i++)
cout << vec[i] << '\n';
}
}
} ac(); int main() {
ac.init();
cin >> n >> m;
for(int i = ; i < m; i++) {
cin >> s[i];
ac.addStr(s[i], i);
}
up = ( << m) - ;
ac.build();
ac.solve();
return ;
} /*
*/
bzoj 1559 AC自动机 + dp的更多相关文章
- bzoj 1030 AC自动机+dp
代码: //先把给的单词建AC自动机并且转移fail,然后d[i][j]表示构造的文章到第i位时处在字典树的第j个节点的不包含单词的数量,最后用总的数量26^m //-d[m][0~sz]即可.其中不 ...
- [BZOJ 1559] [JSOI2009] 密码 【AC自动机DP】
题目链接:BZOJ - 1559 题目分析 将给定的串建成AC自动机,然后在AC自动机上状压DP. 转移边就是Father -> Son 或 Now -> Fail. f[i][j][k] ...
- [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】
题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...
- bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
随机推荐
- 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)
这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...
- 神经网络CNN训练心得--调参经验
1.样本要随机化,防止大数据淹没小数据 2.样本要做归一化.关于归一化的好处请参考:为何需要归一化处理3.激活函数要视样本输入选择(多层神经网络一般使用relu)4.mini batch很重要,几百是 ...
- github访问速度慢,样式加载不完全解决
现象如下图: 解决方案: 绑定host 185.31.17.184 github.global.ssl.fastly.net
- (转)史上最好的Python线程指南
来自AstalWind的好文,彻底认识python线程 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html . . . . .
- java 8新特性 instant
Java 8目前已经开始进入大众的视线,其中笔者在写本文之前,留意到其中Java 8预览版中将会出现新的关于日期和时间的API(遵守JSR310规范).在本系列文章中,将对这些新的API进行举例说明. ...
- No cached version of ..... available for offline mode.
I had same error...Please Uncheck the offline work in Settings. File => Settings => Build, Exe ...
- java -classpath or -cp 的设置和解释
classpath is a parameter—set either on the command-line, or through an environment variable—that tel ...
- bzoj 1912 tree_dp
这道题我们加一条路可以减少的代价为这条路两端点到lca的路径的长度,相当于一条链,那么如果加了两条链的话,这两条链重复的部分还是要走两遍,反而对答案没有了贡献(其实这个可以由任意两条链都可以看成两条不 ...
- input placeholder 兼容问题
placeholder是html5出的新特性,ie9以下是不兼容的, 那么为了兼容ie9 我们需要对他做处理 //jq的处理方式$(function(){ jQuery('[placeholder] ...
- 【nginx】nginx的安装及测试
nginx中文文档:http://www.nginx.cn/doc/index.html 1.到官网下载nginx的压缩包: https://nginx.org/ 2.解压到相应的目录,比如我是e ...