Codeforces Round #207 (Div. 2) Xenia and Hamming(字符串匹配)

http://codeforces.com/contest/357/problem/D

D. Xenia and Hamming
time limit per test
1 second

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.
Sample test(s)
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

思路:

s串azbc,t串gzxydh,串长ls=4,lt=6, 两长度的最大公约数gcd=2,最小公倍数lcm=12;将两个串都扩到长度为12;

az  bc  az  bc  az  bc

gz  xy  dh  gz  xy  dh

以gcd为单位长度将其分段,发现s串中字母si(0<=i<ls)位置为i%gcd(令x=i%gcd),则在lcm长度内,

其必与t串中字母tj(0<=j<lt)位置为j%gcd==x匹配一次;

如上述两字符串,在lcm长度内,s串首母a与t串中g,d,x各匹配一次;


#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
typedef __int64 LL;
const int V=1000100;
char s[V],t[V];
int gcd(int x,int y)
{
    if(!y)return x;
    return gcd(y,x%y);
}
LL n,m;
int ct[V][26];
int main()
{
    while(cin>>n>>m)
    {
        scanf("%s%s",s,t);
        int ls=strlen(s);
        int lt=strlen(t);
        int gd=gcd(ls,lt);
        LL cp=n*ls/((LL)ls/gd*lt);
        memset(ct,0,sizeof(ct));
        for(int i=0;i<lt;i++)
        ct[i%gd][t[i]-'a']++;
        LL ret=(LL)ls/gd*lt;
        for(int i=0;i<ls;i++)
        ret-=ct[i%gd][s[i]-'a'];
        cout<<ret*cp<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值