「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. ...
随机推荐
- Vue学习(五):列表渲染
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 名字管理系统demo
# 名字管理系统demo # 打印功能提示 print('欢迎使用名字管理系统v6.6.6') print('1:添加一个名字') print('2:删除一个名字') print('3:修改一个名字' ...
- flask_sqlalchemy中db.session是如何保持请求间独立的--源码阅读笔记
本文主要是为了验证两个问题: flask处理请求时通过新建线程.进程.协程的区别(顺带一提) flask_sqlalchemy是如何使用db.session使多个请求中保函的改变同一个表的sql操作不 ...
- Python Flask之旅
<Pyhton Flask之旅> 以前学flask时做的总结,搬运到这里,markdown格式写的有点乱,凑合看吧. 参考博客 http://blog.csdn.net/nunchakus ...
- Leetcode 3. Longest Substring Without Repeating Characters (Medium)
Description Given a string, find the length of the longest substring without repeating characters. E ...
- MyEclipse主题设置
1. 打开网页: http://eclipsecolorthemes.org/ 选择自己喜欢的主题,并下载(下载epf文件) 我下载的是 Vibrant Ink 2. 下载完成后,打开myeclips ...
- C++STL——map
一.相关定义 map 关联容器,存储相结合形成的一个关键值和映射值的元素 提供一对一(第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为该关键字的值)的数据处理能力 map对象是模 ...
- 【python爬虫】对喜马拉雅上一个专辑的音频进行爬取并保存到本地
>>>内容基本框架: 1.爬虫目的 2.爬取过程 3.代码实现 4.爬取结果 >>>实验环境: python3.6版本,pycharm,电脑可上网. [一 爬虫目 ...
- 我的python计划
一直想学习一种脚本语言.现在主流的脚本语言,比较先接触的是python 刚开始了解了一下python,感觉挺适合自己的感觉,学习了一段时间,之中感觉,就好象C++一样,把面向对象和面向过程编程结合了起 ...
- 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan
题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...