多校B层冲刺NOIP20211110 字符配对游戏
原题
问题描述
操场边,运动会没有项目的同学也没闲着,经过几天的研究,他们发明了一个很有意思的字符串配对游戏,两位同学准备两张白纸,第一个同学在纸上写一个整数N和一个由小写字母组成的字符串S,将S重复N次后产生一个更长的字符串A;相应的,第二个同学也在纸上写一个整数M,一个由小写字母组成的字符串T,接着他把T重复M次产生字符串B.并且保证字符串A和B的长度相等;这时候,如果A中的第i个字符与B中的第i个字符相同,则称为字符配对成功。给定N、M、S、T,请编写一个程序求A和B的成功配对的字符数。
输入
第一行两个用空格整数N和M。
第二行和第三行分别为S和T。
数据保证A和B的长度相等。
输出
输出为一个整数,表示A和B匹配成功的字符数。
样例
|
3 5 ababa aba |
8 |
数据范围
40%的数据满足 A<=105;
另有30%的数据满足N,M<=109 ;|S|,|T|<=10(|S|表示S的长度);
100%的数据满足 N,M<=109 ;|S|,|T|<=106。
思路
算法一 - 对于40%的数据
按题意直接生成A和B,再一个个比较Ai和Bi是否匹配,时间复杂度O(n),n表示A和B的长度;
算法二 - 对于另30%的数据
S,T的长度不大于10,我们先求出它们的循环节,循环节为 它们的最少公倍数,在循环节里比较每一对字符是否匹配,再 把匹配次数乘以循环次数即可,时间复杂度O(lcm(|S|,|T|));
算法三 - 对于100%的数
在循环节里比较每一对字符会超时,我们计算出两个字串 长度的最大公约数gcd(|S|,|T|),把S和T中的字符按所在的位 置除以gcd(|S|,|T|)的余数进行分类,同类的字符会一一比较, 不同类的字符不会进行比较,在同类字符中统计每个字母出现 的次数,再根据乘法原理计算匹配次数。时间复杂度 O(|S|+|T|));
代码实现
#include <bits/stdc++.h>
using namespace std;
int sum[10001][27][2];
inline int gcd(int a, int b)
{
while (b ^= a ^= b ^= a %= b);
return a;
}
int main()
{
//freopen("string.in", "r", stdin);
//freopen("string.out", "w", stdout);
int n, m;
string s, t;
cin >> n >> m >> s >> t;
int lens = s.length();
int lent = t.length();
int x = gcd(lens, lent), y = n * x / lent;
long long tot1 = 0, tot2 = 0, ans = 0;
for (int i = 0; i < lens; ++i)
{
sum[i % x][s[i] - 'a' + 1][0]++;
}
for (int i = 0; i < lent; ++i)
{
sum[i % x][t[i] - 'a' + 1][1]++;
}
for (int i = 1; i <= 26; ++i)
{
for (int j = 0; j < x; ++j)
{
ans += (sum[j][i][0] * sum[j][i][1] );
}
}
cout << ans *y << endl;
}
记得点赞加关注哦
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hello_wangping/article/details/121249005
多校B层冲刺NOIP20211110 字符配对游戏的更多相关文章
- 多校B层冲刺NOIP20211111模拟12
题面:PDFhttp://xn--gwt928b.accoders.com/pdf/10248/10248.pdfhttp://xn--gwt928b.accoders.com/pdf/10248/1 ...
- day06-java-(方法,猜字符小游戏)
day05-java-(方法,猜字符小游戏) 1.方法: 1)用于封装一段特定的逻辑功能 2)方法应尽可能的独立,只干一件事 3)方法可以被反复的调用多次 4)避免代码重复,有利于代码的维护, ...
- JavaScript实现数字配对游戏
游戏效果如下图所示: 规则: 在4X5的格子中,有随机的互不相等的10个数,每个数据有两份(也就是20个数,有两两相等的十对),随机分布在20个格子中.游戏开始,弹出二十个数的序列.每次点击格子会显示 ...
- LibreOJ #6191. 「美团 CodeM 复赛」配对游戏
二次联通门 : LibreOJ #6191. 「美团 CodeM 复赛」配对游戏 /* LibreOJ #6191. 「美团 CodeM 复赛」配对游戏 概率dp */ #include <cs ...
- [LOJ6191][CodeM]配对游戏(概率期望DP)
n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 首先容易想到用概率算期望,p[i][j][k]表示已加入i个数,1有j个,总长为 ...
- 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...
- 【loj6191】「美团 CodeM 复赛」配对游戏
题目 显然期望dp. 简单想法: f[i][j]表示前i个人中向右看并且没有被消除的人数的概率 如果第i+1个人是向右,$f[i+1][j+1]=f[i][j]/2$ 如果第i+1个人是向左,$f[i ...
- loj #6191. 「美团 CodeM 复赛」配对游戏 期望dp
题意:有一个栈,随机插入 $n$ 次 $0$/$1$ 如果栈顶是 $1$,然后插入 $0$,则将这两个元素都弹出,否则,插入栈顶. 求:$n$ 次操作后栈中期望的元素个数. 我们发现,按照上述弹栈方式 ...
- 【NOIP2016提高A组集训第1场10.29】配对游戏
题目 流行的跳棋游戏是在一个有mn个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数字表示 ...
随机推荐
- VUE3 之 自定义指令的实现 - 这个系列的教程通俗易懂,适合新手
1. 概述 老话说的好:能屈能伸的人生,才是完满而丰富的人生. 言归正传,今天我们来聊聊 VUE 中自定义指令的实现. 2. 自定义指令 2.1 文本框聚焦的实现 <body> < ...
- 为什么 Nginx 比 Apache 更厉害?
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 为什么Nginx在处理高并发方面要优于httpd,我们先从两种web服务器的工作原理以及工作模 ...
- 详谈:pNFS增强文件系统架构
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 通过 NFS(由服务器.客户机软件和两者之间的协议组成) ...
- js项目案例
2021.04.12 --mouseover抖动情况之一
- ABP框架之——数据访问基础架构
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享阅读心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进. 几乎所有的业务应用程序都要适用一种数据库基础架构,用来实现数据访问逻辑,以便从数 ...
- Navicat可视化MySQL数据库
Navicat可视化MySQL数据库 Navicat内部封装了所有的操作数据库的命令,用户只需要点击操作即可,无需书写sql语句. navicat能够充当多个数据库的客户端. 具体操作参考百度. py ...
- GO的日志库log竟然这么简单!
前言 最近在尝试阅读字节开源RPC框架Kitex的源码,看到日志库klog部分,果不其然在Go原生的log库的基础上增加了自己的设计,大体包括增加了一些格式化的输出.增加一些常用的日志级别等. 一番了 ...
- 技术分享 | Appium环境安装与架构介绍
原文链接 Appium架构 Appium 设计哲学 不需要为了自动化而重新编译或修改被测应用 不应该让移动端自动化测试限定在某种语言或者某个具体的框架 不要为了移动端的自动化测试而重新造轮子 移动端自 ...
- Aeraki Mesh正式成为CNCF沙箱项目,腾讯云携伙伴加速服务网格成熟商用
6月,由腾讯云主导,联合百度.灵雀云.腾讯音乐.滴滴.政采云等多家合作伙伴发起的服务网格开源项目 Aeraki Mesh 通过了全球顶级开源基金会云原生计算基金会(CNCF)技术监督委员会评定,正式成 ...
- SAP OLE download to excel
REPORT RSDEMO01 NO STANDARD PAGE HEADING. * this report demonstrates how to send some ABAP data to a ...