Codeforces 357D Xenia and Hamming【数学+思维】

本文介绍了一种高效算法,用于计算两个由重复序列组成的长字符串之间的汉明距离,即不同位置字符的数量。文章详细阐述了如何通过计算序列长度的最小公倍数和最大公约数来简化问题,并给出AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B. Xenia and Hamming
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Xenia is an amateur programmer. Today on the IT lesson she learned about the Hamming distance.

The Hamming distance between two strings s = s1s2... sn and t = t1t2... tn of equal length n is value . Record [si ≠ ti] is the Iverson notation and represents the following: if si ≠ ti, it is one, otherwise — zero.

Now Xenia wants to calculate the Hamming distance between two long strings a and b. The first string a is the concatenation of n copies of string x, that is, . The second string b is the concatenation of m copies of string y.

Help Xenia, calculate the required Hamming distance, given n, x, m, y.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 1012). The second line contains a non-empty string x. The third line contains a non-empty string y. Both strings consist of at most 106 lowercase English letters.

It is guaranteed that strings a and b that you obtain from the input have the same length.

Output

Print a single integer — the required Hamming distance.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

Examples
Input
100 10
a
aaaaaaaaaa
Output
0
Input
1 1
abacaba
abzczzz
Output
4
Input
2 3
rzr
az
Output
5
Note

In the first test case string a is the same as string b and equals 100 letters a. As both strings are equal, the Hamming distance between them is zero.

In the second test case strings a and b differ in their 3-rd, 5-th, 6-th and 7-th characters. Thus, the Hamming distance equals 4.

In the third test case string a is rzrrzr and string b is azazaz. The strings differ in all characters apart for the second one, the Hamming distance between them equals 5.


题目大意:

给你两个字符串,长度不超过1e6,再给你两个数,表示第一个串重复的次数以及第二个串重复的次数。

定义一种距离其计算方式为:

两个字符串相同位子上的不同字符的个数。


思路:


1、首先我们计算出总长度,然后再算出两个字符串长度的lcm,那么对应总长度/lcm的值就是对应循环的次数,记做cont;


2、然后我们设定g=gcd(字符串A的长度,字符串B的长度);

接着我们通过观察和思考发现,对应我们将字符串A和字符串B都分若干个子段,每个子段长度为g,接下来我们统计两个字符串在一个lcm长度之内相同的元素的个数,记做output,

那么不同的元素的个数为lcm-output;

已知其一共重复的次数为cont,那么结果就是cont*(lcm-output)


Ac代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define ll __int64
char a[5000000];
char b[5000000];
ll vis[1005000][26];
ll gcd(ll x,ll y)
{
    return y==0?x:gcd(y,x%y);
}
int main()
{
    ll n,m;
    while(~scanf("%I64d%I64d",&n,&m))
    {
        scanf("%s%s",a,b);
        ll lena=strlen(a);
        ll lenb=strlen(b);
        ll zonglen=n*lena;
        ll g=gcd(lena,lenb);
        ll lcm=lena*lenb/g;
        ll cont=zonglen/lcm;
        ll output=0;
        for(int i=0;i<lena;i++)
        {
            vis[i%g][a[i]-'a']++;
        }
        for(int i=0;i<lenb;i++)
        {
            output+=vis[i%g][b[i]-'a'];
        }
        output=lcm-output;
        output*=cont;
        printf("%I64d\n",output);
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值