题目大意:
给你两个字符串,长度不超过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);
}
}