Codeforces Round #685 (Div. 2) C. String Equality 思维
题意:给你一个原串和模式串,问你能否通过两种操作把原串变成模式串。
操作方法:
1.交换任意相邻字符。
2.将k长度的相同字符子串全+1。
思路:
对于操作1,相当于我们可以任意排序原串。
结合操作2,我们可以尽可能的先将原串中相同的字符聚集起来,然后看看模式串中对应字符的数量,如果原串中更多一点,我们就把多出来的全部丢给下一位字符(+1)。
又因为要k个k个地+1,所以我们看多出来的那些,不够凑到k个的,先用变量bios记录下来,说明我们要用到后面的字符和当前这些剩下的字符一起+1。
如果原串字符更少一些,那么前面的bios就起作用了,就在此时和前面说的剩余字符一起+1,同时更新bios。到最后判断一下bios是否等于0且字符个数全部相等即可。
详见代码注释。
view code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 1e6+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x*f; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };
ll a[500];
ll b[500];
string s;
string t;
bool check(ll k)
{
mem(a,0); mem(b,0);
for(int i=0; i<s.size(); i++) a[s[i]]++; //记录两串字符个数
for(int i=0; i<t.size(); i++) b[t[i]]++;
int bios = 0; //偏移量
for(int i='a'; i<'z'; i++) //比较两串的每个字符,每一步都要变成相等(因为只能从小到大变化,所以当前变不到相等以后就变不到了)
{
if(a[i] > b[i]) // 当前字符原串更多的话
{
int d = a[i] - b[i]; // 看看差多少
a[i] -= d; //全部减去
a[i+1] += d; //丢给下一位
bios += d - (d/k)*k ; //看看有多少是凑不到k个的(剩下来的),说明要利用到后面的字符一起+1
}
else // 如果原串少了
{
int d = b[i] - a[i]; //看看少了多少
if(bios >= d) bios -= d; //能用bios弥补回来就问题不大
else return false; //否则直接false
}
}
if(bios||a['z'] != b['z']) return false; //比较判断
return true;
}
int main()
{
int kase;
cin>>kase;
while(kase--)
{
ll n = read(), k = read();
cin>>s;
cin>>t;
puts(check(k)?"YES":"NO");
}
return 0;
}
Codeforces Round #685 (Div. 2) C. String Equality 思维的更多相关文章
- Codeforces Round #402 (Div. 2) D. String Game
D. String Game time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- Codeforces Round #402 (Div. 2) D. String Game(二分答案水题)
D. String Game time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- Codeforces Round #402 (Div. 2) D String Game —— 二分法
D. String Game time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- 【二分答案】Codeforces Round #402 (Div. 2) D. String Game
二分要删除几个,然后暴力判定. #include<cstdio> #include<cstring> using namespace std; int a[200010],n, ...
- Codeforces Round #685 (Div. 2)
待补 A #include <bits/stdc++.h> using namespace std; int n; int main() { int __; scanf("%d& ...
- Codeforces Round #353 (Div. 2) C. Money Transfers (思维题)
题目链接:http://codeforces.com/contest/675/problem/C 给你n个bank,1~n形成一个环,每个bank有一个值,但是保证所有值的和为0.有一个操作是每个相邻 ...
- Codeforces Round #517 (Div. 2) C. Cram Time(思维+贪心)
https://codeforces.com/contest/1065 题意 给你a,b,让你找尽量多的自然数,使得他们的和<=a,<=b,用在a和b的自然数不能重复 思路 假如只有一个数 ...
- Codeforces Round #380 (Div. 2)/729D Sea Battle 思维题
Galya is playing one-dimensional Sea Battle on a 1 × n grid. In this game a ships are placed on the ...
- Codeforces Round #459 (Div. 2) C题【思维好题--括号匹配问题】
题意:给出一个串,只包含 ( ? ) 三种符号,求出有多少个子串是完美匹配的. ( ) ? ) => ( ) ( ) 完美匹配( ( ) ? => ( ( ) )完美匹配? ? ? ? = ...
- Codeforces Round #646 (Div. 2) B. Subsequence Hate (思维,前缀和)
题意:给你一个只含有\(0\)和\(1\)的字符串,每次操作可以将\(0\)改成\(1\)或\(1\)改成\(0\),问最少操作多少次,使得子序列中不含有\(010\)和\(101\). 题解:仔细想 ...
随机推荐
- 邮件自动回复助手(Rasa/SMTP)实现教程
在现代办公场景中,处理大量邮件是一项既耗时又容易出错的任务.为了提升工作效率,我们可以利用自然语言处理(NLP)和邮件传输协议(SMTP)技术,构建一个智能的邮件自动回复助手.本文将详细介绍如何使用P ...
- Mastik:微体系结构侧信道攻击工具包
1. 引言 微体系结构侧通道攻击利用了处理器内部组件的竞争,从而泄漏了进程之间的信息.虽然从理论上讲这类攻击很简单,但实际的实现方式往往很复杂,并且需要对文献记载不充分的处理器函数和其他领域专有的知识 ...
- Apache Druid RCE漏洞复现及修复(CVE-2023-25194)
Apache Druid RCE漏洞复现及修复(CVE-2023-25194) 2023-03-16 声明:本文分享的安全工具和项目均来源于网络,漏洞环境本地搭建,仅供安全研究与学习,如用于其他用途, ...
- <HarmonyOS第一课01>HarmonyOS介绍
视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717496599725471?ha_sou ...
- Spring Bean元数据体系与Spring容器
>>>点击去看B站配套视频<<< 系列文章目录和关于我 1. 从一个例子开始 小陈申请加盟咖啡店后,小陈收到总部寄来的<开店规格单>.这份文件允许每家分 ...
- SQL优化 - 同比计算
记录一次SQL优化, 在计算同比的时候. 就太久没有写语句了, 能力在逐渐下滑, 思维也是, 感觉还是有点可怕的. 自从转业务以来, 就基本没有碰过代码这方面了. 甚至连 SQL 都开始要搜索了. 而 ...
- Java 注解使用教程
简介 Java 1.5 引入了注解,现在它在 Java EE 框架(如 Hibernate.Jersey 和 Spring )中被大量使用.Java 注释是该语言的一个强大特性,用于向 Java 代码 ...
- 掌握Node.js原理,开启异步编程之旅
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- RPC实战与核心原理之如何在没有接口的情况下进行RPC调用
如何在没有接口的情况下进行RPC调用 回顾 RPC 如何通过动态分组来实现秒级扩缩容,其关键点就是"动态"与"隔离" RPC调用 RPC 调用,本质上就是调用端 ...
- 以STM32为例的MCU启动过程
以STM32为例的MCU启动过程 在面试的时候,好多位面试官问过这个问题,即从上电后,到第一行main函数语句的执行,软件部分都在做什么.这次看了微控制器是如何启动的? |STM32 为例演示微控制器 ...