【题目大意】

给出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」说无可说的更多相关文章

  1. 「6月雅礼集训 2017 Day1」看无可看

    [题目大意] 给出n个数,a[1]...a[n],称作集合S,求

  2. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  3. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  4. 「6月雅礼集训 2017 Day11」delight

    [题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...

  5. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  6. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  7. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  8. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

  9. 「6月雅礼集训 2017 Day8」gcd

    [题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...

随机推荐

  1. 转MySQL详解--索引

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  2. 【数据结构】 Queue 的简单实现

    [数据结构] Queue 的简单实现 public class XQueue<T> { /// <summary> /// 第一个元素 /// </summary> ...

  3. iOS笔记058 - IOS之多线程

    IOS开发中多线程 主线程 一个iOS程序运行后,默认会开启1条线程,称为"主线程"或"UI线程" 作用 显示和刷新界面 处理UI事件(点击.滚动.拖拽等) 注 ...

  4. CSS3 :animation 动画

    CSS3动画分为二部份: 1.定义动画行为: 使用@keyframes定义动画行为,有两种方式: 方式一:仅定义动画起始样式,与动画结束样式 @keyframes (动画行为名称) { from {b ...

  5. wpf显示视频,image控件闪屏,使用winform控件实现

    使用C#调用mingw的动态库实现视频识别软件,程序通过C++调用opencv打开视频,将图像的原始数据以rgb24的方式传递给C#端,C#通过构造图像对象给控件赋值的方式显示图片. 一开始使用wpf ...

  6. Linux SPI总线和设备驱动架构之一:系统概述

    SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器.传感器.存储设备,SPI设备分为主设备和从设备两种,用 ...

  7. laravel 学习随笔(一)

    1.路由参数:路由参数总是通过花括号进行包裹,参数在路由被执行时会被传递到路由的闭包.(路由参数不能包含“-”字符,如有需要可以用“_”代替):

  8. Object类中的五种方法

    clone() Object类源码:protected native Object clone() throws CloneNotSupportedException; 这里有个问题:为什么Sun公司 ...

  9. epc笔记

    http://wenku.baidu.com/view/5e921520dd36a32d7375812a.html 1.  先注册, EPC注册EPS业务或non-EPS服务 ?? HSS做什么? 2 ...

  10. JAXB使用方式

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...