「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. ...
随机推荐
- ora-12154 TNS:"无法处理服务名"的一个解决方法
http://www.cnblogs.com/xh3/archive/2007/04/21/722217.html 很怪异的一个问题,在网络环境下配置客户端,竟然怎么也连不上主机了,看了不少帖子,大多 ...
- 关于transition动画下,如果有fixed元素,渲染的奇葩问题
之前我们机票页面有生成一个低价日历,然后我们有一个需求就是滚动到那个月份,对应显示这个月,然后这个区域是fixed定位的,然后奇怪的事情发生了,就是低价日历的动画执行完后,修改页面的html却没有正常 ...
- 用gradle编译任意结构的Android项目
## 需求 * 继续用`Eclipse`项目的结构,但是使用`gradle`编译,或者说任意的项目结构进行编译. ## 解决方案 1. Android studio的项目结构 1. Android S ...
- Ubuntu下使用Git_3
这里是我举得小白阶段比较困难的地方了, 当在我们向远程数据库推送数据之前,有其他用户向远程数据库推送的相同的文件的时候,服务器会拒绝我们的推送,这个时候就需要我们来整合这两个文件 如图说是,现在显示的 ...
- Ubuntu下使用Git_1
这里小小的记录一下我在Ubuntu下使用版本控制工具Git的过程.在学习使用Git的时候,我发现了一个很好的网站,这里分享一下,大家共同学习. 猴子都能懂的Git入门 http://git.wiki. ...
- 使用Scrapy自带的ImagesPipeline下载图片,并对其进行分类。
ImagesPipeline是scrapy自带的类,用来处理图片(爬取时将图片下载到本地)用的. 优势: 将下载图片转换成通用的JPG和RGB格式 避免重复下载 缩略图生成 图片大小过滤 异步下载 . ...
- 《学习OpenCV》课后习题解答7
题目:(P105) 创建一个结构,结构中包含一个整数,一个CvPoint和一个 CvRect:称结构体为"my_struct". a. 写两个函数:void Write_my_st ...
- php获取微信token和ticket并返回签名
jssdk.php页,主要获取token和ticket <?php /* * 微信公众号后台里获取appId和appSecret,并在公众号后台=>安全中心=>IP白名单中设置当前页 ...
- Citrix Netscaler版本管理和选择
Citrix Netscaler版本管理和选择 来源 http://blog.51cto.com/caojin/1898164 随着Citrix Netscaler的快速发展,有很多人在维护设备时经常 ...
- BZOJ 2005 2005: [Noi2010]能量采集 | 容斥原理
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题解: http://blog.csdn.net/popoqqq/article/de ...