每一行对话分别取匹配所有的表情

这样是一个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] 点的区间覆盖的更多相关文章

  1. codeforces Gym 100187F F - Doomsday 区间覆盖贪心

    F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F ...

  2. 高效算法——E - 贪心-- 区间覆盖

    E - 贪心-- 区间覆盖 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/E 解题思路: 贪心思想, ...

  3. UVa 10020 - Minimal coverage(区间覆盖并贪心)

    Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose the min ...

  4. 贪心算法----区间覆盖问题(POJ2376)

    题目: 题目的大概意思是约翰这个农民有N条牛,这些牛可以在一天中的某个时间段可以进行工作,他想把这个时间段分成若干个片段让这些牛去进行打扫任务,你的任务是安排尽量少的牛然后可以完成分成这些片段的打扫任 ...

  5. UVA 10382 Watering Grass(区间覆盖,贪心)题解

    题意:有一块草坪,这块草坪长l 米,宽 w 米,草坪有一些喷头,每个喷头在横坐标为 p 处,每个喷头的纵坐标都是(w/2) ,并且喷头的洒水范围是一个以喷头为圆心,半径为 r 米的圆.每次最少需要打开 ...

  6. UVa 10382 Watering Grass (区间覆盖贪心问题+数学)

    题意:有一块长为l,宽为w的草地,在其中心线有n个喷水装置,每个装置可喷出以p为中心以r为半径的圆, 选择尽量少的装置,把草地全部润湿. 析:我个去啊,做的真恶心,看起来很简单,实际上有n多个坑啊,首 ...

  7. POJ 2376 Cleaning Shifts (贪心,区间覆盖)

    题意:给定1-m的区间,然后给定n个小区间,用最少的小区间去覆盖1-m的区间,覆盖不了,输出-1. 析:一看就知道是贪心算法的区间覆盖,主要贪心策略是把左端点排序,如果左端点大于1无解,然后, 忽略小 ...

  8. 贪心问题:区间覆盖 POJ 1328 Rader Installation

    题目:http://poj.org/problem?id=1328 题意:给定海岛个数,雷达半径,输入各个海岛坐标,求能覆盖所有海岛的最少雷达数 题解: 1. 贪心的区间覆盖问题,尽量让每个雷达覆盖更 ...

  9. 贪心问题:区间覆盖 NYOJ 喷水装置(二)

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水 ...

随机推荐

  1. java基础—接口概念

    一.接口的概念 JAVA是只支持单继承的,但现实之中存在多重继承这种现象,如“金丝猴是一种动物”,金丝猴从动物这个类继承,同时“金丝猴是一种值钱的东西”,金丝猴从“值钱的东西”这个类继承,同时“金丝猴 ...

  2. js函数式编程(一)-纯函数

    我将写的第一个主题是js的函数式编程,这一系列都是mostly adequate guide这本书的读书总结.原书在gitbook上,有中文版.由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱.中文 ...

  3. message() 信息提示

    //样式部分 .message { position: fixed;top: -100px;width: 400px;left: 50%;margin-left: -200px;z-index: 10 ...

  4. new和delete的动态分配。

    c++对象模型 视频的实际操作  note: 1.虚函数有虚指针,所以是4,不管有几个虚函数, 都只有一个vptr来存放调用的虚函数的地址. 2.子类的内存是父类内存的加自己的数据内存. 3.clas ...

  5. 使用slot-scope复制vue中slot内容

    有时候我们的vue组件需要复制使用者传递的内容. 比如我们工程里面的轮播组件需要使用复制的slot来达到循环滚动的效果 使用者关注轮播内容的静态效果,组件负责让其滚动起来 组件: <div cl ...

  6. mybatis枚举类型处理器

    1. 定义枚举值的接口 public abstract interface ValuedEnum { int getValue(); } 所有要被mybatis处理的枚举类继承该接口 2. 定义枚举类 ...

  7. Manjaro 添加国内源和安装搜狗输入法

    Manjaro 系统虽然比 Ubuntu 用着稳定,但有些小地方没有 Ubuntu 人性化,比如默认安装完的系统貌似没有中国的,Ubuntu 估计是用的人多,所以安装完后会根据所在地给你配置更新的源. ...

  8. atag信息处理

    machine_desc->boot_params参数保存的是u-boot传入的启动参数的地址,如果没有传入启动参数,使用如下的默认参数: /* * This holds our default ...

  9. jdk生成证书,网站请求变成https

    生成证书的步骤 1.进入jdk的bin目录 keytool -genkey -alias tomcat -keyalg RSA   命名证书的名字叫tomcat 2.将证书拷贝至tomcat的bin目 ...

  10. 如何从Maven中央存储库下载?

    根据 Apache Maven说明: 下载时由项目的 pom.xml 文件的依赖来决定,目前不在本地存储库触发(当中央存储库包含了一个更新).默认情况下,Maven将从中央存储库下载. 在Maven中 ...