牛客练习赛17 B-好位置

传送门

题意:本来惯例中文题不解释的, 但是有些人不懂这个题意, 简单的来说, 就是s1每一个的每一个字符都可以和别的字符构成一个子串 == s2。  算了还是惯例中文题意不解释吧。

题解:其实以前写nowcoder的比赛的时候,已经被nowcoder的数据给震惊过了,可是昨天发现有人交随机数过的,有人交Java套数据过的,汗,然后中午被某人催了写一下这个题目。

其实很简单,对于s1, 我们从开头匹配出最先的s2子串,并且对应的位置记录下L[i], 在从末尾开始匹配出最后的s2子串,并且记录下对应的位置R[i]。 其中i表示为s2的第i个字符。

     然后对于第i个字符c来说,   所有位置在 L[i] 和 R[i] 之间的 c 都是合法的, 因为 我们可以取 L[i]的前半部分子串, 加上c, 并且加上 R[i]的后半部分子串 就可以构成 s2的串了。

     然后稍微贪省力一下,就差分标记一下就好了。

最后遍历一下s1的所有位置, 看一下是否合法就好了。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
 4 #define LL long long
 5 #define ULL unsigned LL
 6 #define fi first
 7 #define se second
 8 #define pb push_back
 9 #define lson l,m,rt<<1
10 #define rson m+1,r,rt<<1|1
11 #define max3(a,b,c) max(a,max(b,c))
12 #define min3(a,b,c) min(a,min(b,c))
13 typedef pair<int,int> pll;
14 const int INF = 0x3f3f3f3f;
15 const LL mod = 1e9+7;
16 const int N = 2e5+10;
17 char s1[N];
18 char s2[N];
19 int L[N], R[N];
20 int sum[N][26];
21 int main(){
22     ///Fopen;
23     scanf("%s%s", s1, s2);
24     int len1 = strlen(s1), len2 = strlen(s2);
25     int j = -1, id ;
26     for(int i = 0; i < len2; i++){
27         j++;
28         while(j < len1 && s1[j] != s2[i]) j++;
29         if(j == len1) {puts("No"); return 0;}
30         id = s2[i] - ‘a‘;
31         sum[j][id]++;
32     }
33     j = len1;
34     for(int i = len2-1; i >= 0; i--){
35         j--;
36         while(j >= 0 && s1[j] != s2[i]) j--;
37         if(j == -1) {puts("No"); return 0;}
38         id = s2[i] - ‘a‘;
39         sum[j+1][id]--;
40     }
41     for(int i = 1; i < len1; i++)
42         for(int j = 0; j < 26; j++)
43             sum[i][j] += sum[i-1][j];
44     for(int i = 0; i < len1; i++){
45         id = s1[i] - ‘a‘;
46         if(!sum[i][id]){puts("No"); return 0;}
47     }
48     puts("Yes");
49     return 0;
50 }

    

原文地址:https://www.cnblogs.com/MingSD/p/8996586.html

时间: 2024-08-30 15:11:51

牛客练习赛17 B-好位置的相关文章

转载:牛客练习赛17 c 规律题

转载:https://www.cnblogs.com/zzqc/p/8995135.html C.链接:https://www.nowcoder.com/acm/contest/109/C来源:牛客网 题目描述 给定长度为n的数组a,定义一次操作为:1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007:2. 执行a = s:现在问k次操作以后a长什么样. 输入描述: 第一行两个整数n,k(1 <= n <= 2000,

牛客练习赛17

A 长方体 题目描述 给出共享长方体一个顶点的三个面的面积,求它十二条边的边长和. 输入描述: 一行三个整数a, b, c表示面积(1 <= a, b, c <= 10000). 输出描述: 一行一个整数表示边长和. 输入例子: 1 1 1 输出例子: 12 --> 示例1 输入 1 1 1 输出 12 示例2 输入 4 6 6 输出 28 节约时间就直接暴力做了. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 i

牛客练习赛11 B trie树+拓扑判环 E 分治求平面最近点对

牛客练习赛11 B  假的字符串题意:给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们. tags:好题 对于一个字符串, 1]如有其它字符串是它的前缀,那肯定不可能.这个直接用字典树处理就可以. 2]但如果以这个字符串为最小,怎么判定其它字符串不会矛盾呢? 其实矛盾的情况详细一点说是: 比如要以  abcd 为最小, 但又有另一个字符串 aba ,这就矛盾了. 对这种情况,在跑字典树的时候,我们对有相同父亲结点的多个儿

牛客练习赛18

链接:https://www.nowcoder.com/acm/contest/110/A来源:牛客网 最大乘积 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积最大是多少?请输出答案除以2000000000000000003(共有17 个零) 的余数. 举例来说,当 S = 5 时,若干个数的和为 5

newcoder 练习赛17 B 好位置 dp 最长公共子序列

链接:https://www.nowcoder.com/acm/contest/109/B来源:牛客网 好位置 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 给出两个串s和x 定义s中的某一位i为好的位置,当且仅当存在s的子序列 满足y=x且存在j使得i=kj成立. 问s中是否所有的位置都是好的位置. 输入描述: 一行两个字符串s,x,这两个串均由小写字母构成.1 <= |s|, |x|

牛客练习赛1 补题记录

A 矩阵 中文题意,要找一个最大的k阶子矩阵在原矩阵中出现过两次. 需要将这个矩阵进行Hash,也就是需要二维Hash,先把每一行Hash了,再把每一列Hash了,有一点前缀的感觉. 预处理完Hash值之后,二分答案k,check过程是在$O(n ^ 2)$枚举起点,这里其实枚举终点方便一些,边界比较好处理,把每个k阶矩阵的hash值存下来,最后看有没有两个一样的. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int

牛客练习赛13

幸运数字 I 定义一个数字为幸运数字当且仅当它的所有数位都是4或者7. 比如说,47.744.4都是幸运数字而5.17.467都不是. 现在,给定一个字符串s,请求出一个字符串,使得: 1.它所代表的整数是一个幸运数字: 2.它非空: 3.它作为s的子串(不是子序列)出现了最多的次数(不能为0次). 请求出这个串(如果有多解,请输出字典序最小的那一个). s中无4或7,输出-1 4的个数大于等于7,输出4 否则输出7 幸运数字 II 定义一个数字为幸运数字当且仅当它的所有数位都是4或者7. 比如

牛客练习赛 16

在各位ak的大佬中,我感觉我寄几好菜啊... 题目描述 给定字符串s,s只包含小写字母,请求出字典序最大的子序列. 子序列:https://en.wikipedia.org/wiki/Subsequence 字典序:https://en.wikipedia.org/wiki/Lexicographical_order 输入描述: 一行一个字符串s (1 <= |s| <= 100,000). 输出描述: 字典序最大的子序列. 示例1 输入 ababba 输出 bbba 示例2 输入 abbcb

牛客练习赛16

A   字典序最大的子序列 > 25960019 一开始潜意识看成了循环,最长子串-- 找每个字母最晚出现的位置,那么比它小的字符必须出现在 在它之后的位置 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <set> 6 #include <map> 7 #include <list>