【题解】AGC007E Shik and Copying String(贪心)

【题解】AGC007E Shik and Copying String(贪心)

刚开始看完题以为是一个老鼠进洞模型,不过发现这里还要求不同种类的匹配不可香蕉,而且代价不是一定的...

追踪最终得到的串\(T\)每个字符\(T_i\)的来源,可以发现是一条引向\(p<i\)的折线,可以发现这条直线覆盖的\(x\)轴上的长度越小越好,最终答案是所有形如这样的匹配的折线中拐点最多的折线的拐点个数。用一个双端队列维护当前匹配的拐点的\(x\)坐标,从后向前考虑\(T\)中每个字符的匹配。

设当前枚举到\(T_i\),而\(T_{i+1}\)匹配到\(S_p\),双端队列中维护了所有拐点的坐标。考虑最大的\(p'<p,S_{p'}=T_i\)。

  • 若\(p=p'\),那么\(T_{i+1}\)可以直接从\(T_i\)这里继承过去,那么\(T_i\)匹配的拐点是点i+上一个折线所有坐标\(< i\)的拐点。
  • 若\(p\not = p'\),那么由于要保证\(x\)的跨度尽量小,新的折线最优应该是上一次的折线所有的(坐标+1)加上(可能需要的,为了匹配到这次的\(p'\))的拐弯。

代码

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;  typedef long long ll;
int n,ans;
const int maxn=1e6+5;
char S[maxn],T[maxn];
deque<int> q;
int main(){
    scanf("%d%s%s",&n,S+1,T+1);
    q.push_back(n+1);
    for(int t=n,p=n+1,offset=0;t;--t){
        int sav=p;
        while(p&&(p>t||S[p]!=T[t])) --p;
        if(p<1) puts("-1"),exit(0);
        if(sav==p){
            while(q.size()&&q.back()-offset>=t) q.pop_back();
            q.push_back(t+offset);
        }else{
            ++offset;
            if(t!=p) ans=max(ans,(int)q.size()),q.push_front(p+offset);
        }
    }
    cout<<ans<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/12315458.html

时间: 2024-10-28 15:12:22

【题解】AGC007E Shik and Copying String(贪心)的相关文章

UVa 714 Copying Books(贪心 二分)

题意  把m数分成k组  使每组数的和的最大值最小  如果有多种分法 靠前的组的和尽量小 关键是找出那个最小的最大值   可以通过二分来找出  开始左端点为m个数中最大的数  右端点为m个数的和  若中点能将m个数分为小于等于k组  比它大的肯定都是可以的  中点变为右端点   否则中点变成左端点 然后就可以贪心逆向模拟了  从后往前每组选择尽量多的数直到剩下的数等于组数 #include <bits/stdc++.h> using namespace std; typedef long lo

CodeForce-797C Minimal string(贪心模拟)

Minimal string CodeForces - 797C Petya 收到一个长度不超过 105 的字符串 s.他拿了两个额外的空字符串 t 和 u 并决定玩一个游戏.这个游戏有两种合法操作: 将 s 串的第一个字符移动到字符串 t 的末尾. 将 t 串的最后一个字符移动到字符串 u 的末尾. Petya 希望将 s 和 t 都变为空串并且使得串 u 字典序最小. 你需要写一个代码求出最小的字典序. Input 第一行包含一个非空串 s (1?≤?|s|?≤?105),只包含小写字母.

UVa 714 Copying books 贪心+二分 最大值最小化

题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相同的,求所有书抄完所用的最少时间的分配方案. 题目中的要求是去求划分的子序列的最大值尽量小,最大值最小化,如果从划分的角度看,无法获得好的思路,我们可以从值得角度考虑,所要求的最小的最大值必定是从[amax,sum(总和)]中取得的,那么我们可以二分法的方式猜测一个数字,看它是否满足要求,如果满足要求,我们可

hdu 5414 CRB and String (贪心)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5414 题意:给定字符串s和t,可以在s里面选一个字符c,然后任选一个字符d(d!=c)将d插入到c的后面,问能不能将s变为t. 分析:先考虑可以插的字符(串)的情况,若在字符串"sd"的字符s后面插字符串p(|p|>=1),只要p[0]!='s'就行,比如p="oola",第一个o插在's'后面,第二个也插在's'后面,是可以的.那么对s和t里面的字符进行匹配,并且是

Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)【ABCD】(题解)

目录 涵盖知识点:思维.树状数组. 比赛链接:传送门 A - Even Subset Sum Problem B - Count Subrectangles C - Unusual Competitions D - Present E - Instant Noodles F - Reality Show 涵盖知识点:思维.树状数组. 比赛链接:传送门 A - Even Subset Sum Problem 题意: 找一个子序列使得和为偶数 题解: 选一个偶数或者两个奇数. Accept Code

Card Game Cheater(贪心+二分匹配)

Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1566    Accepted Submission(s): 822 Problem Description Adam and Eve play a card game using a regular deck of 52 cards. The rule

【HNOI2013】题解 bzoj3139~bzoj3144

比赛 题目:  http://www.lydsy.com/JudgeOnline/problem.php?id=3139 题解: 3$\le$N$\le$10,比较明显是一个搜索题,一开始我是直接搜了,没有记忆化,如果先枚举每一队可以的胜负平,加上合法性判断,再进行枚举,那么是可以拿到70分的,这里有一个重要的剪枝,在枚举了每一队的情况后一定要判断胜场+负场是否相等,这里有20分.. 以下正解: 在爆搜的时候我们每一队每一队去枚举,我们尝试着记忆化. 首先我们发现,对于一组数据,得分序列(读入序

POJ 2370 Democracy in danger(简单贪心)

Democracy in danger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3388   Accepted: 2508 Description In one of the countries of Caribbean basin all decisions were accepted by the simple majority of votes at the general meeting of citize

POJ 2209 The King(简单贪心)

The King Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7499   Accepted: 4060 Description Once upon a time in a country far away lived a king and he had a big kingdom. He was a very clever king but he had one weakness -- he could count