HDU1936 [贪心+KMP] 点的区间覆盖
每一行对话分别取匹配所有的表情
这样是一个n**2的匹配,可以用KMP 找出每行对话中的每个表情的左右端点
这样相当于就是问用最少多少个点 可以覆盖所有的区间(每个区间中放一个点表示覆盖)
贪心 按右端点升序排列 相同时左端点也升序(这里其实没有影响但是 按照匹配上来讲 应该按照升序)
--理由:
--> 如果当前所指区间的后面两个区间的右端点相同 那么应该是先比较左端点较小的那个区间
但是因为后面两个区间的右端点相同那么一定是相互覆盖的 所以对结果没有影响
然后 if (strict[crt].r < strict[next]) .l ) //区间不重叠
{ans++; crt = next;}
代码君:
#include <bits/stdc++.h>
#include <string.h>
#include <iostream>
#include <stdio.h> using namespace std; const int MAXN = ;
const int MAXLEN = ;
char emo[MAXN][MAXLEN];
char str[MAXLEN]; struct S
{
int l, r;
S() {}
S(int l, int r) : l(l), r(r) {}
bool operator < (S s1) const
{
if (r != s1.r) return r < s1.r;
return l < s1.l;
}
}; int n, m;
int nxt[MAXN << ];
vector<S> v;
void kmp_pre(char t[])
{
int j, k;
int tlen = strlen(t);
k = -, j = ; nxt[] = -;
while (j < tlen)
{
if (k == - || t[j] == t[k]) nxt[++j] = ++k;
else k = nxt[k];
}
}
vector<int> kmp(char s[], char t[])
{
int slen = strlen(s), tlen = strlen(t);
vector<int> ret;
int i = , j = ;
kmp_pre(t);
while (i < slen)
{
if (j == - || s[i] == t[j])
{
i++;
j++;
}
else j = nxt[j];
if (j == tlen)
{
ret.push_back(i-);
j = nxt[j];
}
}
return ret;
}
int lidx[MAXN], ridx[MAXN];
int main()
{
//freopen("in.txt", "r", stdin);
while (~scanf("%d%d", &n, &m))
{
if (!n && !m) break;
int ans = ;
for (int i = ; i < n; i++)
{
scanf("%s", emo[i]);
}
getchar();
for (int i = ; i < m; i++)
{
gets(str);
v.clear();
for (int j = ; j < n; j++)
{
vector<int> pos;
int len = strlen(emo[j]);
pos = kmp(str, emo[j]);
for (int k = ; k < pos.size(); k++)
{
v.push_back(S(pos[k]-len+, pos[k]));
}
}
sort(v.begin(), v.end());/*
for (int i = 0; i < v.size(); i++) cout << v[i].l << " " << v[i].r << endl;
return 0;*/
int crt = ;
if (!v.empty()) ans++;
for (int j = ; j < v.size(); j++)
{
if (v[j].l > v[crt].r)
{
crt = j;
ans++;
}
}
}
cout << ans << endl;
}
return ;
}
HDU1936 [贪心+KMP] 点的区间覆盖的更多相关文章
- codeforces Gym 100187F F - Doomsday 区间覆盖贪心
F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F ...
- 高效算法——E - 贪心-- 区间覆盖
E - 贪心-- 区间覆盖 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 解题思路: 贪心思想, ...
- UVa 10020 - Minimal coverage(区间覆盖并贪心)
Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose the min ...
- 贪心算法----区间覆盖问题(POJ2376)
题目: 题目的大概意思是约翰这个农民有N条牛,这些牛可以在一天中的某个时间段可以进行工作,他想把这个时间段分成若干个片段让这些牛去进行打扫任务,你的任务是安排尽量少的牛然后可以完成分成这些片段的打扫任 ...
- UVA 10382 Watering Grass(区间覆盖,贪心)题解
题意:有一块草坪,这块草坪长l 米,宽 w 米,草坪有一些喷头,每个喷头在横坐标为 p 处,每个喷头的纵坐标都是(w/2) ,并且喷头的洒水范围是一个以喷头为圆心,半径为 r 米的圆.每次最少需要打开 ...
- UVa 10382 Watering Grass (区间覆盖贪心问题+数学)
题意:有一块长为l,宽为w的草地,在其中心线有n个喷水装置,每个装置可喷出以p为中心以r为半径的圆, 选择尽量少的装置,把草地全部润湿. 析:我个去啊,做的真恶心,看起来很简单,实际上有n多个坑啊,首 ...
- POJ 2376 Cleaning Shifts (贪心,区间覆盖)
题意:给定1-m的区间,然后给定n个小区间,用最少的小区间去覆盖1-m的区间,覆盖不了,输出-1. 析:一看就知道是贪心算法的区间覆盖,主要贪心策略是把左端点排序,如果左端点大于1无解,然后, 忽略小 ...
- 贪心问题:区间覆盖 POJ 1328 Rader Installation
题目:http://poj.org/problem?id=1328 题意:给定海岛个数,雷达半径,输入各个海岛坐标,求能覆盖所有海岛的最少雷达数 题解: 1. 贪心的区间覆盖问题,尽量让每个雷达覆盖更 ...
- 贪心问题:区间覆盖 NYOJ 喷水装置(二)
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水 ...
随机推荐
- QT5:介绍
一.简介 QT是一个跨平台的C++开发库,主要用来开发图形用户界面(Graphical User Interface,GUI) QT除了可以绘制漂亮的界面(包括控件/布局/交互),还可以多线程/访问数 ...
- db2的定时备份
定时任务: db2.bat db2cmd -i -w db2_backup.bat exit db2_backup.bat db2 connect to TEST db2 force applicat ...
- flowvisor连接ovs
1 开启flowvisor $ sudo -u flowvisor fvconfig generate /etc/flowvisor/config.json $ sudo /etc/init.d/fl ...
- k8s Pod的自动水平伸缩(HPA)
我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能 但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少. 这就很麻烦了,总不能为了需求总 ...
- k8s的高级调度方式
默认的scheduler的调度过程:1.预选策略:从所有节点当中选择基本符合选择条件的节点.2.优选函数:在众多符合基本条件的节点中使用优选函数,计算节点各自的得分,通过比较进行排序.3.从最高得分的 ...
- jQuery plugin : bgStretcher 背景图片切换效果插件
转自:http://blog.dvxj.com/pandola/jQuery_bgStretcher.html bgStretcher 2011 (Background Stretcher)是一个jQ ...
- Python 成长之路
Python roadmap python 基础 ... 内置常用函数.三元运算.递归 迭代器和生成器 模块和常用的模块 面向对象 对向对象进阶 网络编程 并发编程 ... 数据库 MySQL pym ...
- LeetCode(154) Find Minimum in Rotated Sorted Array II
题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...
- poj-1700 crossing river(贪心题)
题目描述: A group of N people wishes to go across a river with only one boat, which can at most carry tw ...
- Party Games UVA - 1610 贪心
题目:题目链接 思路:排序后处理到第一个不同的字符,贪心一下就可以了 AC代码: #include <iostream> #include <cstdio> #include ...