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)个点状的喷水 ...
随机推荐
- PAT (Basic Level) Practise (中文)-1020. 月饼 (25)
http://www.patest.cn/contests/pat-b-practise/1020 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量. ...
- shell脚本,awk里面的BEGIN讲解。
解释: BEGIN{}这个特殊的pattern最常用的就是 变量赋值. BEGIN这个pattern就是文件没开始读的时候 执行 awk 'BEGIN{FS=":";OFS=&qu ...
- runtime比较全面的总结
类和对象 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者 ...
- UICollectionView实现无限轮播
#import "KGNewsController.h"#import "KGNewsCell.h"#import "KGNews.h"#i ...
- 如何理解JavaScript中的this关键字
前言 王福朋老师的 JavaScript原型和闭包系列 文章看了不下三遍了,最为一个初学者,每次看的时候都会有一种 "大彻大悟" 的感觉,而看完之后却总是一脸懵逼.原型与闭包 可以 ...
- Linux网络配置指令
版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址: https://www.cnblogs.com/poterliu/p/6686799.html 重启网卡service network ...
- PHP 代码优化建议
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.当然了,这个测试方法需要在十万级以上次执行,效果才明显.其实静态方法和非静态方法的效率 ...
- PHP获取文件夹内所有文件包括子目录文件的名称或路径
/* * new getFile($_dir[,$_emptyDir,$_fileType]); * @parma $_dir 是目录名称 * @parma $_emptyDir 是否获取空文件夹,选 ...
- Linux压缩与归档
文件的压缩 aaaaaabbbbccc压缩成为6a4b3c 压缩工具: gzip/gunzip: .gz后缀 只能压缩文件,不能压缩目录,因其不具备归档功能 ...
- LA 7072 Signal Interference 计算几何 圆与多边形的交
题意: 给出一个\(n\)个点的简单多边形,和两个点\(A, B\)还有一个常数\(k(0.2 \leq k < 0.8)\). 点\(P\)满足\(\left | PB \right | \l ...