Codeforces Round #207 (Div. 2) D. Xenia and Hamming

来源:互联网 发布:json.parse出错 编辑:程序博客网 时间:2024/05/18 00:48

这道题拖得也蛮久的。现在过了,有点感动。

这种题如果你智商180,当场可以YY出结论,如果你做题经验较丰富

猜出结论也不是什么太难的事。

分析下几组数据,看下面3类数列吧

第一类

123123123123123

123451234512345

第二类

1212

1234

第三类

123456123456123456

123456789123456789

发现了什么呢?

很多时候,我们固定一个点,然后就会发现

设上面数列不重复个数为a

下面为b

上面每个点对应了下面的b/gcd(a,b)个点

大悟?这不就是a*b/gcd(a,b)=lcm吗?

然后就是编码,首先容易想到一个O(a*b)

很明显题目要求一个O(n)的。。。具体见代码

/*    author:ray007great    version:1.0*/#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<set>#include<map>#include<string>#include<time.h>#include<queue>using namespace std;typedef long long ll;//c++#pragma comment(linker, "/STACK:102400000,102400000")// g++//int size = 256 << 20; // 256MB//char *p = (char*)malloc(size) + size;//__asm__("movl %0, %esp\n" :: "r"(p) );#define sf(a) scanf("%d",&a)#define sfs(a) scanf("%s",a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define repd(i,a,b) for(int i=(a);i>=(b);i--)#define rep1(i,a,b) for(int i=(a);i<(b);i++)#define clr(a) memset(a,0,sizeof(a))#define clr1(a) memset(a,-1,sizeof(a))#define pfk  printf("fuck\n")/*  define *//* clock  *///clock_t start, finish;//start = clock();//finish = clock();//double duration = (double)(finish - start)/CLOCKS_PER_SEC;//printf( "%.10f seconds\n", duration );/* clock *//* data *//* data */int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}string str1,str2;//int d1[2000000][30];int d2[1000010][30];int main(){    ll n,m;    cin>>n>>m;    cin>>str1;    cin>>str2;    int len1=str1.length();    int len2=str2.length();    int g=gcd(len1,len2);    ll lcm=(ll)len1/g*len2;    //for(int i=0;str1[i];i++){      //  d1[i%g][str1[i]-'a']++;    //}    for(int i=0;str2[i];i++){        d2[i%g][str2[i]-'a']++;    }    ll ans=0;    for(int i=0;str1[i];i++){        int id=str1[i]-'a';        for(int j=0;j<26;j++){            if(j==id) continue;            ans+=d2[i%g][j];        }    }    ans*=n*len1/lcm;    cout<<ans<<endl;    return 0;}



原创粉丝点击