给出字符串s和t,以及s的长度n的一个全排列,求按照这个排列依次删除s的字符,删到何时s中不含子序列t。

解法一:

t中的每个字符的位置在s中跳啊跳,合法的情况下t中的字符在s中的位置应该是单调递增的,因此让t中的字符在s中建的邻接表里跳啊跳就好了。

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std; #define maxs 200011
char s[maxs];int ls;
char t[maxs];int lt;
int first[],next[maxs],P[maxs];
bool vis[maxs];
bool Play(int x)
{
if (x==lt-) return ;
if (P[x+]<=P[x])
{
while (P[x+]!=- && (P[x+]<=P[x] || vis[P[x+]])) P[x+]=next[P[x+]];
if (P[x+]==-) return ;
return Play(x+);
}
return ;
}
int x;
int find(int x)
{
int L=,R=lt-;
while (L<R)
{
int mid=(L+R)>>;
if (x<=P[mid]) R=mid;
else L=mid+;
}
return L;
}
int main()
{
scanf("%s",s);ls=strlen(s);
scanf("%s",t);lt=strlen(t);
memset(first,-,sizeof(first));
for (int i=ls-;i!=-;i--)
{
int now=s[i]-'a'+;
next[i]=first[now];
first[now]=i;
}
int ans=;
for (int i=;i<lt;i++)
P[i]=first[t[i]-'a'+];
bool flag=;
for (int i=;i<lt-;i++)
if (!Play(i)) {flag=;break;}
if (flag)
{
memset(vis,,sizeof(vis));
for (int i=;i<ls;i++)
{
scanf("%d",&x);x--;
vis[x]=;
int pos=find(x);
if (P[pos]==x)
{
P[pos]=next[P[pos]];
while (P[pos]!=- && vis[P[pos]]) P[pos]=next[P[pos]];
if (P[pos]==-) break;
if (!Play(pos)) break;
}
ans++;
// for (int j=0;j<ls;j++) cout<<vis[j]<<' ';cout<<endl;
// for (int j=0;j<lt;j++) cout<<P[j]<<' ';cout<<endl;
}
}
printf("%d\n",ans);
return ;
}

该代码在随机数据下表现良好,因此如果是oi赛制可以拿到不错的分数。但是理论复杂度是n2的,而且存在aaaa……这样的数据使得t中每个字符都要跳n次。

解法二:

我们要在排列中找一个位置,它左边的都符合某个条件,而右边都不符合。二分!!

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
//#include<iostream>
using namespace std; #define maxs 200011
char s[maxs];int ls;
char t[maxs];int lt;
int a[maxs];
bool vis[maxs];
int main()
{
scanf("%s%s",s,t);
ls=strlen(s),lt=strlen(t);
for (int i=;i<ls;i++) scanf("%d",&a[i]),a[i]--;
int L=,R=ls-;
while (L<R)
{
int mid=(L+R+)>>;
memset(vis,,sizeof(vis));
for (int i=;i<mid;i++) vis[a[i]]=;
int j=;
for (int i=;i<ls;i++)
if (j<lt && s[i]==t[j] && !vis[i]) j++;
if (j==lt) L=mid;
else R=mid-;
}
printf("%d\n",L);
return ;
}

CF778A:String Game的更多相关文章

  1. 深入理解Java:String

    在讲解String之前,我们先了解一下Java的内存结构. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两 ...

  2. c++:string函数

    string类的构造函数:string(const char *s);    //用c字符串s初始化string(int n,char c);     //用n个字符c初始化此外,string类还支持 ...

  3. 原生JS:String对象详解

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  4. Java:String和Date、Timestamp之间的转

    Java:String和Date.Timestamp之间的转 一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr  ...

  5. Java:String和Date、Timestamp之间的转换

    一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2016-9-28 12:25:55" ...

  6. java:String使用equals和==比较的区别

    原文链接:http://www.cnblogs.com/tinyphp/p/3768214.html "=="操作符的作用 1.用于基本数据类型的比较 2.判断引用是否指向堆内存的 ...

  7. 【转】Java魔法堂:String.format详解

    Java魔法堂:String.format详解     目录     一.前言    二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六. ...

  8. Java:String、StringBuffer和StringBuilder的区别

    1 String String:字符串常量,字符串长度不可变.Java中String是immutable(不可变)的. String类的包含如下定义: /** The value is used fo ...

  9. leetcode:String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

随机推荐

  1. 洛谷P2770 航空路线问题(费用流)

    题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...

  2. 洛谷2017 5月月赛R1

    我只想说面对这种难度的题目就是冲着20%的数据暴力... 分数:40+20+36.1+38+0+19 T1 签到题 III 题目背景 pj组选手zzq近日学会了求最大公约数的辗转相除法. 题目描述 类 ...

  3. The lion king 经典句型摘录

    What am I going to do with him? Everything the light touches is our kingdom. But I thought a king ca ...

  4. laravel模型关联

    hasOne 一对一 用户名-手机号hasMany 一对多   文章-评论belongTo 一对多反向 评论-文章belongsToMany    多对多 用户-角色hasManyThrough 远程 ...

  5. IE8 window.open 不支持此接口 的问题解决

    在使用vs2010调试代码时,突然出现 window.open 不支持此接口的提示,开始认为是不是vs的问题,后来上网查询说是系统问题.我不想重装系统,之后发现是IE的问题,使用其他浏览器浏览系统不会 ...

  6. 工作中Docker使用命令笔记

    docker安装与启动 安装docker [root@localhost /]# yum -y install docker-io 更改配置文件 [root@localhost /]# vi /etc ...

  7. vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、mockjs用法、路由懒加载三种方式

    不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p> ...

  8. dede网站目录权限设置

    如果你的网站数据十分重要(那种两天就能弄好的垃圾站就算了),建议按本文所说的安全步骤进行严格的设置.1.目录权限 我们不建议用户把栏目目录设置在根目录, 原因是这样进行安全设置会十分的麻烦, 在默认的 ...

  9. js 数组元素排序?

    Part.1  sort 方法 js 有自带排序方法 sort(),  默认 升序 排列 如: data() { return { arr: [1,3,2,5,6,8,7,4,9] } }, 控制台如 ...

  10. 【搜索】P1041 传染病控制

    题目链接:P1041 传染病控制 题解: 这个题目是看别人的博客做出来的,其实挺不错的一个题目,考察的东西挺多的, 一个dfs可以处理5个东西: 1.找出父亲 2.找出深度 3.每一层的节点,存进Ve ...