NSOJ10050 Newspaper Headline
题意:给你一个<10^4的S串和<10^6的T串,通过将S串重复k次,然后将其中一些多余的字母删掉可以获得T串,问k最小是多少,没有的话输出1.
思路:对于每个T串里的字母,我们从左到右扫,由于我们一定要找到对应的字母,于是我们必然是尽可能早的在S串里找到这个字母,然后再从匹配的串的位置开始继续往后找T串的下一个字母。所以贪心的思路就是我们总是尽量在S串的前面匹配到T的对应字母。
譬如样例 S:abcd T:dabc, 首先我们肯定要匹配d,所以我们一开始将指针移到S的d的位置,然后发现往后不能再匹配了,然后又回到串首,发现可以匹配d的下一个a,然后从a开始又能匹配下一个b,类似的我们就可以匹配完全部的字母了,然后得出最少的次数。
实现的话其实也不困难,我们可以建一个类似自动机的东西,S串的每个字母相当于一个状态,然后对每个字母我们推算出其下一个最近的a,b,c,d...z在哪个位置。实现的方法很简单,开一个vector<int> alpha[26],alpha[i]存的是第i个字符的所有下标,所以每次找的时候就一个upper_bound就可以了。然后就在这个自动机上走就是了,每次走到NULL结点的时候cnt++. 如果当前在根结点仍然不能往下匹配到下一个T串的点的时候就说明是-1。
题目还是挺简单的,不知道为什么当时没什么人过,赛后也没什么人做。。- -0
#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#define ll long long
#define maxn 10500
using namespace std; char S[maxn];
char T[maxn*100]; struct Node
{
Node *go[26];
void init() { memset(go, 0, sizeof(go)); }
}pool[maxn];
Node *root;
vector<int> alpha[26];
vector<int>::iterator it;
int main()
{
while (~scanf("%s%s", S, T))
{
int lens = strlen(S);
pool[0].init();
root = &pool[0];
for (int i = 0; i < 26; i++) {
alpha[i].clear();
alpha[i].push_back(0);
}
for (int i = 0; i < lens; i++){
pool[i + 1].init();
alpha[S[i] - 'a'].push_back(i + 1);
}
for (int i = 0; i <= lens; i++){
for (int j = 0; j < 26; j++){
it = upper_bound(alpha[j].begin(), alpha[j].end(), i);
if (it == alpha[j].end()) continue;
else pool[i].go[j] = &pool[*it];
}
}
int cnt = 0;
int lent = strlen(T);
Node *p = NULL; bool flag = true;
int i = 0;
while(i<lent){
if (p == NULL) cnt++, p = root;
if (p == root&&p->go[T[i] - 'a'] == NULL) {
flag = false; break;
}
p = p->go[T[i] - 'a'];
if (p != NULL) i++;
}
if (flag) printf("%d\n", cnt);
else printf("-1\n");
}
return 0;
}
NSOJ10050 Newspaper Headline的更多相关文章
- CodeForces 91A Newspaper Headline
题目链接:CodeForces - 91A Newspaper Headline 官方题解: In this problem letters from s1 should be taken gree ...
- AtCoder Beginner Contest 058 ABCD题
A - ι⊥l Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Three poles st ...
- Newspaper Headline_set(upper_bound)
Description A newspaper is published in Walrusland. Its heading is s1, it consists of lowercase Lati ...
- week0713.5 newspaper 安装问题
然后爆红说nltk==2.0.5 太老了 所以我们 把包下载下来将requirements文件中nltk==2.0.5改成3.3.0 然后 将包打包 然后安装这个包就OK 下载newpaper wge ...
- 解决pymysql.err.InternalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x8C\\xB8' for column 'headline' at row 1")
解决pymysql.err.InternalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x8C\\xB8' for column ...
- TPO-15 C1 The campus newspaper's reporter position
TPO-15 C1 The campus newspaper's reporter position 第 1 段 1.Listen to a conversation between a Studen ...
- python3使用newspaper快速抓取任何新闻文章正文
newspaper用于爬取各式各样的新闻网站 1,安装newspaper pip install newspaper3k 2,直接上代码 from newspaper import Article u ...
- [翻译角]Headline English: A Captain Should Be Pitch Perfect at a Multitude of Skills (ESLPOD Blog)
以下转自www.eslpod.com,翻译为本人添加.其余版权均归原网站所有. ESLPOD是一个英语学习网站,我最初知道这个网站,是因为“奶爸”<把你的英语用起来>(电子版3元)一书的推 ...
- 爬虫时安装的newspaper 新闻包
Newspaper3k: Article scraping & curation 首先在命令行安装 newspaper pip install Newspaper3k 然后导入包进行写代码 f ...
随机推荐
- OpenGL第6、7讲小结
因为内容比较多,所以只看了两讲(强行解释). 一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制. 现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得 ...
- 第二章 开始学习C++
第二章 开始学习C++ 2.1 main函数 简单代码如下: #include <iostream> int main() { //This is my first program u ...
- 【风马一族_windom】 批量修改相同文件类型的后缀
难题:有时因为某种原因,修改一堆文件的类型,重复操作次数多,浪费时间也跟着多,收获也会相当少. 提问:对于软件而言,可量化的,有规律的操作,可以使用程序来进行替代. 特性:在微软操作系统上,不同后缀的 ...
- centos6.5安装fpm打包工具
FPM功能简单说就是将一种类型的包转换成另一种类型.FPM的github:https://github.com/jordansissel/fpm 1.支持的源类型包: dir: 将目录打包成所需要的类 ...
- [转]Android在eclipse中的快捷键
1.选中你要加注释的区域,用ctrl+shift+C 会加上//注释2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/* */注释3.要修改在eclispe中的命令的快捷键方式我们只 ...
- win7局域网无法ping通本机的问题解决方法
对于window7系统,很多朋友会发现:默认下是不允许被ping的,其实都系统自带的防护墙所阻止了,新建一个策略就可以实现被ping通,如下操作
- 安装gitolite,并ssh公钥无密码登录
安装gitolite,并ssh公钥无密码登录 gitolite是管理git版本库的一种方案,它将git版本库的管理信息放在了一个特殊git版本库里.gitolite与linux操作系统集成了,需要使用 ...
- PHP 登录完成后如何跳转上一访问页面
访问网站页面时,有的页面需要授权才能访问,这时候就会要求用户登录,跳转到登录页面login.php,怎么实现登录后返回到刚才访问的页面 项目需求 访问网站页面时,有的页面需要授权才能访问,这时候就会要 ...
- 分享:mysql 随机查询数据
在mysql中查询5条不重复的数据,使用以下: 1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了.但是真正测试一下才发现这样效率非常低.一个1 ...
- ASP.NET中的常用快捷键
想查找ASP.NET中的属性快捷键,忘记了,搜了一下,找到了ASP.NET中的常用快捷键. 大神文章:http://www.cnblogs.com/xiacao/archive/2012/06/12/ ...