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

这样是一个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 ;
}

最新文章

  1. [转]YII2 常用数据库操作
  2. thinkphp,javascript跨域请求解决方案
  3. 奇怪的Lisp和难懂的计算机程序的构造和解释
  4. Codeforces Round #327 (Div. 1) D. Top Secret Task
  5. Input输入字体颜色改变js(兼容IE)
  6. Java基础(3) -字符串
  7. Spring Framework 5.0 新特性
  8. Android开发艺术探究Note
  9. python 面向对象进阶之内置方法
  10. java笔试要点(java.sql包)
  11. 使用http服务提供yum源
  12. 图解HTTP阅读笔记(1)-网络基础TCP/IP
  13. 阿里云SLB负载均衡与使用SSL域名证书
  14. Good Bye 2018 C. New Year and the Sphere Transmission
  15. 【转】python之random模块分析(一)
  16. Spring事务原理
  17. BZOJ.2453.维护队列([模板]带修改莫队)
  18. Scrum立会报告+燃尽图(十一月二十六日总第三十四次):上传β阶段展示视频
  19. Python下使用 redis数据库
  20. 【Codeforces711E】ZS and The Birthday Paradox [数论]

热门文章

  1. Bootstrap 下拉菜单(dropdown)插件
  2. 01_8_Struts用DomainModel接收参数
  3. 洛谷 P1593 因子和
  4. LaTeX中常用数学符号总结
  5. (66)zabbix导入/导出配置文件
  6. MySQL中文转换成拼音的函数
  7. 树莓派编译ncnn
  8. 20181210(os,os.path,subprocess,configparser,shutil)
  9. leetcode-23-DynamicProgramming-1
  10. solr配置中文分词器