「6月雅礼集训 2017 Day1」说无可说
【题目大意】
给出n个字符串,求有多少组字符串之间编辑距离为1~8。
n<=200,∑|S| <= 10^6
【题解】
首先找编辑距离有一个n^2的dp,由于发现只找小于等于8的,所以搜旁边16个状态即可。
复杂度O(n^2|S| * 16)
# include <vector>
# include <stdio.h>
# include <iostream>
# include <string.h>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int N = + , M = 1e6 + , AN = ;
const int mod = 1e9 + ; int n, len[M], ans[AN];
vector<char> a[N];
char str[M]; int u, v;
int dp[][M];
inline int f(int i, int j) {
if(i == ) return j;
if(j == ) return i;
if(j < max(, i-) || j > min(len[v], i+)) return 1e9;
return dp[i&][j];
} inline void fin(int i, int j, int s) {
dp[i&][j] = s;
} inline int gans() {
for (int i=; i<=len[v] || i<=len[u]; ++i) fin(, i, ), fin(, i, );
for (int i=; i<=len[u]; ++i)
for (int j=max(, i-), jto = min(i+, len[v]); j<=jto; ++j) {
fin(i, j, min(f(i-, j), f(i, j-)) + );
if(a[u][i-] != a[v][j-]) fin(i, j, min(f(i, j), f(i-, j-) + ));
else fin(i, j, min(f(i, j), f(i-, j-)));
}
return f(len[u], len[v]);
} int main() {
// freopen("say.in", "r", stdin);
// freopen("say.out", "w", stdout);
cin >> n;
for (int i=; i<=n; ++i) {
scanf("%s", str);
len[i] = strlen(str);
for (int j=; str[j]; ++j) a[i].push_back(str[j]);
}
for (int i=, tem; i<=n; ++i) {
for (int j=i+; j<=n; ++j) {
u = i, v = j;
tem = gans();
if(tem >= && tem <= ) ++ ans[tem];
}
} for (int i=; i<=; ++i) cout << ans[i] << ' ';
cout << endl;
return ;
}
当然,过不了,有60分。
所以考虑dp有很多空余状态,改成dfs加剪枝就可以过了。。
# include <vector>
# include <stdio.h>
# include <iostream>
# include <string.h>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int N = + , M = 1e6 + , AN = ;
const int mod = 1e9 + ; int n, len[M], ans[AN];
vector<char> a[N];
char str[M]; # define ABS(x) ((x) > ? (x) : -(x)) int tem;
inline void solve(int u, int v, int cur_u, int cur_v, int cnt) {
if(cnt + ABS(len[v] - len[u] - (cur_v - cur_u)) >= tem) return;
while(cur_u < len[u] && cur_v < len[v]) {
if(a[u][cur_u] != a[v][cur_v]) {
solve(u, v, cur_u+, cur_v, cnt+);
solve(u, v, cur_u, cur_v+, cnt+);
solve(u, v, cur_u+, cur_v+, cnt+);
return ;
}
++cur_u, ++cur_v;
}
if(cur_u == len[u]) tem = min(tem, cnt + len[v] - cur_v);
if(cur_v == len[v]) tem = min(tem, cnt + len[u] - cur_u);
} int main() {
// freopen("say.in", "r", stdin);
// freopen("say.out", "w", stdout);
cin >> n;
for (int i=; i<=n; ++i) {
scanf("%s", str);
len[i] = strlen(str);
for (int j=; str[j]; ++j) a[i].push_back(str[j]);
}
for (int i=; i<=n; ++i) {
for (int j=i+; j<=n; ++j) {
tem = ;
solve(i, j, , , );
++ ans[tem];
}
} for (int i=; i<=; ++i) cout << ans[i] << ' ';
cout << endl; return ;
}
这里dfs的时候需要注意一点,要一段一段跳,不能一格一格跳,会T。。
「6月雅礼集训 2017 Day1」说无可说的更多相关文章
- 「6月雅礼集训 2017 Day1」看无可看
[题目大意] 给出n个数,a[1]...a[n],称作集合S,求
- 「6月雅礼集训 2017 Day10」quote
[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...
- 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...
- 「6月雅礼集训 2017 Day11」delight
[题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...
- 「6月雅礼集训 2017 Day11」jump
[题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...
- 「6月雅礼集训 2017 Day11」tree
[题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...
- 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)
[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...
- 「6月雅礼集训 2017 Day8」route
[题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...
- 「6月雅礼集训 2017 Day8」gcd
[题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...
随机推荐
- Linux的系统安全设置Shell脚本
#!/bin/sh # desc: setup linux system security # powered by www.lvtao.net #account setup passwd -l xf ...
- jsp 添加jstl标签
jsp页面中添加下列代码即可使用jstl标签. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix=" ...
- 3、shader深度测试(Cull、ZWrite 、ZTest )
剔除和深度测试是渲染法线中的一个流程 Cull:默认情况下,Unity中给的所有Shader都是单面的,它都把反面的渲染给关闭掉了,如果你在开发的过程中需要使用到双面,只要把cull关闭(off)即可 ...
- 《python机器学习—预测分析核心算法》:理解数据
参见原书2.1-2.2节 新数据集就像一个包装好的礼物,它充满了承诺和希望! 但是直到你打开前,它都保持神秘! 一.基础问题的架构.术语,机器学习数据集的特性 通常,行代表实例,列代表属性特征 属性, ...
- Hyperledger02
docker 思想 模块化: 集装箱 标准化: 运输标准化, 存储方式标准化,API接口的标准化 安全性: 隔离 docker解决什么问题 devops 我这程序程序没问题啊 系统好卡.哪个程序死循环 ...
- thinkPHP form表单提交参数无法获取
后台打印获取的数据为empty, 找了半天,是因为 input标签没有写name, 真是醉了!记一下,免得以后再犯错了.
- BZOJ 2333 SCOI2011 棘手的操作 并查集+可并堆
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干 ...
- Week8 Teamework from Z.XML-Z.XML游戏功能说明
我们小组的游戏终于新鲜出炉了,好开心~ 快来看看有什么功能吧. 游戏目标::=打倒最多的敌人,获得积分,放松心情,获取快乐. 游戏菜单::= 关于+设置+帮助+积分榜+开始游戏吧 (截图还在路上..) ...
- websocket协议详解;
websocket是基于http协议,借用http协议来完成连接阶段的握手: 当连接建立后,浏览器和服务器之间的通信就和http协议没有关系了,b.s之间只用websocket协议来完成基本通信. = ...
- IDEA使用maven构建时控制台中文乱码的解决办法
使用maven clean install 项目时控制台中文乱码,解决办法如下: Setting->maven->runner VMoptions: -Dfile.encoding=UTF ...