B. Xenia and Hamming----数论入门LCA与GCD的应用

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 cincout streams or the %I64dspecifier.

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.


题目链接:http://codeforces.com/contest/356/problem/B


题目的意思是说给你两个字符串重复的次数,给你两个字符串,问你相同位置不同的字母有多少个。

div1的水题。。

我们先不看重复次数,先看两个字符串的长度,我们求出其lca,总长度是n*len1,那么剩下的len1*n-lca这一些就是在重复lca长度内的不同的次数。

然后我们根据lca开数组,发现有可能开不开,所以我们很自然想到了gcd,这个我们还没有用,我们把字符串分段,分成每段长度为gcd,然后求就可以了。

本以为这个做会出错,MLE等各种错误,但是竟然过了。。。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;
char s1[2000000];
char s2[2000000];
int a[1000010][30];
int main(){
    LL n,m;
    scanf("%I64d%I64d",&n,&m);
    scanf("%s%s",s1,s2);
    LL len1=strlen(s1);
    LL len2=strlen(s2);
    LL GCD=__gcd(len1,len2);
    LL LCM=len1/GCD*len2;
    LL ans=0;
    for(int i=0;i<len1;i++){
        a[i%GCD][s1[i]-'a']++;
    }
    for(int i=0;i<len2;i++){
        ans+=a[i%GCD][s2[i]-'a'];
    }
    LL cnt=LCM-ans;
    //cout<<LCM<<" "<<ans<<" "<<cnt<<endl;
    printf("%I64d\n",n*len1/LCM*cnt);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值