[luogu] P3333 [ZJOI2013]丽洁体(贪心)

P3333 [ZJOI2013]丽洁体

题目描述

平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子。这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中。许多同学都喜欢做这种题,因为较其它题显得有趣。仿写的句子往往具有“A__B__C”的形式,其中A,B,C是给定的由一个或多个单词组成的短句,空的部分需要学生填写。当然,考试的时候空在那里也是可以的。例如,“其实天不暗阴云终要散,其实 ,其实 ,其实路不远一切会如愿,艰难困苦的日子里我为你祈祷,请你保重每一天”。再比如,“见了大海的汹涌,没见过大山的巍峨,真是遗憾;见了大山的巍峨,没见过 ,还是遗憾。出发吧,永远出发。 ,人有不老的心情。”

由于现在是网络时代,我们不再只能仿写命题人命的题,我们可以仿写网上各种句子和段落。2011年3月26日,某人在博客上发布了的消息就惹来了很多人的仿写。

很难过吧。。。考得完爆了。。。

。。。。。。其实也没什么可以说的。。。都是蒟蒻的借口罢了。。。

。。。自己果然还只是半吊子水平呢。。。。

。。。祝大家都能进省队。。。其实只要不要有遗憾就好了呢。。。

虽然我很遗憾或许不能走下去了。。。。。

886

在网络上广泛流传的仿写,因为在某些地方有独到之处,大都被命名为“某某体”。打开人人,刷新微博,你也能发现这样和那样的体,比如,对不起体,**说明他爱你体等等。金先生注意到了这一现象,他敏锐地认为这是一个很有价值的研究课题,于是就其展开研究,打算发一篇paper。由于在网上发消息,人们有了更大的灵活度,人们有时因为表达的需要,还往原本固定的A, B, C中添加一些修饰的词语。这就给辨别一个句子或段落是否是另一个句子或段落的仿写增加了困难。

金先生现在研究一种形如“ABC”的体作品,其中A, B, C分别是某个由若干单词组成的短句,*代表0个或多个单词。他在网上找了大量的体作品,不过很多体作品不太合乎原作者的格式,也就是相当于在正规的体作品中插入了0个或多个单词。

由于数据量太大,金先生无法一个一个看过去,于是想请你帮忙,去掉尽量少的单词,使它成为指定的体。

输入输出格式

输入格式:

包含4行。

第一行是某个也许不规范的体作品T,

接下来三行分别代表A, B, C。

输出格式:

仅一行,包含一个数,即最少的去除单词数。

输入输出样例

输入样例#1: 复制

xiang yao yi zhi ai zhe mou wu de hua yi yao guai zhi si lai shuo tai chang le xiang yao shi xian yi qie meng xiang de hua yi ren lei zhi sheng lai shuo tai duan le
yao
tai chang le yao
tai duan le

输出样例#1: 复制

2

说明

【样例说明】

在上述样例中,不规范的体作品为:“想要一直爱着某物的话,以妖怪之死来说太长了;想要实现一切梦想的话,以人类之生来说太短了”。

规范的体形如:“要太长了要太短了”。

修改后的规范的体为:“要一直爱着某物的话,以妖怪之死来说太长了;要实现一切梦想的话,以人类之生来说太短了”。

【数据规模与约定】

对于20%的数据,1≤|T|, |A|, |B|, |C|≤10。 对于40%的数据,1≤|T|, |A|, |B|, |C|≤100。 对于70%的数据,1≤|T|, |A|, |B|, |C|≤1000。 对于100%的数据,1≤|T|, |A|, |B|, |C|≤50000;所有单词长度不超过5,出现次数不超过500;数据保证答案总存在。

题解

本题两个难点。

1.读题
每个单词重复不超过500个,注意这一点。
2.卡读入
据说是换行读入很玄学。
我至今不知道为什么我本地AC的代码,始终在BZOJ和X谷上RE。

一个很简单的贪心。
对于A,C我们肯定是优先两端能选就选的。
对于B,因为单词重复不超过500次,所以,我们找到那500个和B相同的开头,然后\(O(len|T|)\)每次强行跑一遍,取最小值就可以了。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int N=1e5+5;
int n,a,b,c,ans;
string s[N],A[N],B[N],C[N];
int main(){
    char ss;n++;
    /*while(1){
        ss=getchar();
        if(ss=='\n')break;
        if(ss==' '){n++;continue;}
        s[n]+=ss;
    }a++;
    while(1){
        ss=getchar();
        if(ss=='\n')break;
        if(ss==' '){a++;continue;}
        A[a]+=ss;
    }b++;
    while(1){
        ss=getchar();
        if(ss=='\n')break;
        if(ss==' '){b++;continue;}
        B[b]+=ss;
    }c++;
    while(1){
        ss=getchar();
        if(ss=='\n')break;
        if(ss==' '){c++;continue;}
        C[c]+=ss;
     }*/
    do{
            cin>>s[++n];
    }while(getchar()==' ');
    do{
            cin>>A[++a];
    }while(getchar()==' ');
    do{
            cin>>B[++b];
    }while(getchar()==' ');
    do{
            cin>>C[++c];
    }while(getchar()==' ');
    int l=1,r=n,top1=1,top2=c;
    while(1){
        if(top1==a&&s[l]==A[a]){ans+=l-a;break;}
        if(s[l]==A[top1])top1++;l++;
    }
    while(1){
        if(top2==1&&s[r]==C[1]){ans+=n-r+1-c;break;}
        if(s[r]==C[top2])top2--;r--;
    }l++;r--;int sum=200000000,cnt=20000000,top3,x;
    for(int i=l;i<=r;i++){
        if(s[i]==B[1]){
            top3=1;cnt=0;x=i;
            while(1){
                if(x>r){cnt=2e9;break;}
                if(top3==b&&s[x]==B[b])break;
                if(s[x]==B[top3])top3++,x++;else x++,cnt++;
            }sum=min(sum,cnt);
    }
    cout<<ans+sum<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/hhh1109/p/10667126.html

时间: 2024-11-06 01:31:55

[luogu] P3333 [ZJOI2013]丽洁体(贪心)的相关文章

并不对劲的bzoj3214:p3333:[ZJOI2013]丽洁体

题目大意 有三个由若干个单词组成的字符串\(T,A,B,C(|T|,|A|,|B|,|C|\leq 5*10^4,单词长度\leq5,每个单词出现次数\leq500)\) 求从\(T\)中至少删去多少个单词,使\(T\)变成\(A*B*C\)的形式,其中\(*\)可以用若干个单词替换,输入数据保证有解 题解 发现删去若干个单词后,一个前缀变成了\(A\),一个后缀变成了\(C\),那么找到最短的有\(A\)为子序列的前缀和最短的有\(C\)为子序列的后缀就行 在剩下的部分中,找到最短的以\(B\

bzoj 3214: [Zjoi2013]丽洁体

Description 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿 写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其它题显得有 趣.仿写的句子往往具有"A__B__C"的形式,其中A,B,C是给定的由一个或多个单词组成的短句,空的部分需要 学生填写.当然,考试的时候空在那里也是可以的.例如,"其实天不暗阴云终要散,其实 ,其实 ,其实路不远 一切会如愿,艰难困苦的日子里我为你祈

[ZJOI2013]丽洁体

题目描述 平时的练习和考试中,我们经常会碰上这样的题:命题人给出一个例句,要我们类比着写句子.这种往往被称为仿写的题,不单单出现在小学生的考试中,也有时会出现在中考中.许多同学都喜欢做这种题,因为较其它题显得有趣.仿写的句子往往具有“A__B__C”的形式,其中A,B,C是给定的由一个或多个单词组成的短句,空的部分需要学生填写.当然,考试的时候空在那里也是可以的.例如,“其实天不暗阴云终要散,其实 ,其实 ,其实路不远一切会如愿,艰难困苦的日子里我为你祈祷,请你保重每一天”.再比如,“见了大海的

【BZOJ】3214: [Zjoi2013]丽洁体

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3214 字符串长度最大不超过$5$直接$HASH$起来 首先在$T$中考虑找到最前的一个包含$A$的子序列,找到最后的一个包含$C$的子序列,直接贪心的确定了$A,C$的位置. 在剩下的区间内$DP$出最合适的$B$的位置. 我们要找到一个区间${[l,r]}$使得$B$是它的子序列,显然应该最小化$r-l$. 令$F[i]$表示$B$中第$i$单词最晚出现的位置. $g[i]$表示$B$

[luogu]P2279 [HNOI2003]消防局的设立[贪心]

[luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算

Luogu P1084 疫情控制 | 二分答案 贪心

题目链接 观察题目,答案明显具有单调性. 因为如果用$x$小时能够控制疫情,那么用$(x+1)$小时也一定能控制疫情. 由此想到二分答案,将问题转换为判断用$x$小时是否能控制疫情. 对于那些在$x$小时内不能够走到根节点的子节点上的军队,让他们尽量往上走即可,走到哪里是哪里,这样显然不会更劣. 对于那些在$x$小时内能走到根节点的子节点上的军队,就让他们先走到根节点的子节点上. 然后搞搞贪心即可. #include<iostream> #include<cstdio> #incl

luogu 1066 引水入城(bfs+贪心)

90分,有一个点TLE.... 首先可以证明一个东西,如果从上面一排的某个点bfs一次到最下面一排的饮水点不是一个区间的话,那么最后一定所有饮水点不会被覆盖完的. 证明考虑反证法. 所以从上面一排的每个点bfs一次得到一个区间.题目转化为给出m个区间覆盖m个点的最小区间选择数. 显然是个明显的贪心,以左区间端点为第一关键字升序排序,右区间端点为第二关键字降序排序,那么每次贪心的选择一个覆盖最大的区间即可. 时间复杂度O(n*m^2+mlogm).需要常数优化. # include <cstdio

luogu P1186玛丽卡

题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保

luogu P1186 玛丽卡

题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保