Advertisement
yicongli

Gym 101848H

Jan 24th, 2021
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define ll long long
  7. #define db double
  8. #define fr friend
  9. #define op operator
  10.  
  11. template<typename T>
  12. inline void read(T&x){
  13.     x=0;T k=1;char gc;
  14.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  15.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  16. }
  17.  
  18. const int N=1<<20|7;
  19.  
  20. int gcd(int a,int b){
  21.     return b?gcd(b,a%b):a;
  22. }
  23.  
  24. struct comp{
  25.     double r,i;
  26.     comp():r(0),i(0){}
  27.     comp(const double &_r,const double &_i):r(_r),i(_i){}
  28. }F[N],G[N],Wn[N];
  29.  
  30. inline comp operator + (const comp &a,const comp &b){
  31.     return comp(a.r+b.r,a.i+b.i);
  32. }
  33.  
  34. inline comp operator - (const comp &a,const comp &b){
  35.     return comp(a.r-b.r,a.i-b.i);
  36. }
  37.  
  38. inline comp operator * (const comp &a,const comp &b){
  39.     return comp(a.r*b.r-a.i*b.i,a.r*b.i+a.i*b.r);
  40. }
  41.  
  42. inline comp operator / (const comp &a,const double &b){
  43.     return comp(a.r/b,a.i/b);
  44. }
  45.  
  46. inline comp conj(const comp &a){
  47.     return comp(a.r,-a.i);
  48. }
  49.  
  50. int len;
  51. int r[N];
  52. const db pi=acos(-1.0);
  53. const comp Tmp=comp(0,-0.25);
  54.  
  55. inline void DFT(comp *t){
  56.     for(int i=0;i<len;++i)if(i<r[i])swap(t[i],t[r[i]]);
  57.     for(int i=1;i<len;i<<=1){
  58.         comp wn(Wn[i].r,Wn[i].i);
  59.         for(int j=0;j<len;j+=(i<<1)){
  60.             comp w(1,0);
  61.             for(int k=0;k<i;++k,w=w*wn){
  62.                 comp u=t[j+k];
  63.                 comp v=w*t[j+k+i];
  64.                 t[j+k]=u+v;
  65.                 t[j+k+i]=u-v;
  66.             }
  67.         }
  68.     }
  69. }
  70.  
  71. inline void IDFT(comp *t){
  72.     for(int i=0;i<len;++i)if(i<r[i])swap(t[i],t[r[i]]);
  73.     for(int i=1;i<len;i<<=1){
  74.         comp wn(Wn[i].r,-Wn[i].i);
  75.         for(int j=0;j<len;j+=(i<<1)){
  76.             comp w(1,0);
  77.             for(int k=0;k<i;++k,w=w*wn){
  78.                 comp u=t[j+k];
  79.                 comp v=w*t[j+k+i];
  80.                 t[j+k]=u+v;
  81.                 t[j+k+i]=u-v;
  82.             }
  83.         }
  84.     }
  85.     for(int i=0;i<len;++i)t[i].r/=len;
  86. }
  87.  
  88. char s[N],t[N];
  89.  
  90. int Ans[N];
  91.  
  92. int main(){
  93.     int n,m,l=0;ll k;read(n),read(m),read(k);
  94.     if(n<m)scanf("%s%s",t,s),swap(n,m);
  95.     else scanf("%s%s",s,t);
  96.  
  97.     memcpy(s+n,s,n);
  98.     n<<=1;reverse(s,s+n);
  99.    
  100.     for(len=1;len<=max(m,n);len<<=1)++l;
  101.     for(int i=0;i<len;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  102.     for(int i=1;i<len;i<<=1)Wn[i]=comp(cos(pi/i),sin(pi/i));
  103.  
  104.     for(int i=0;i<len;++i)F[i]=comp(s[i]=='A',t[i]=='A');
  105.     DFT(F);
  106.     for(int i=0,j;i<len;++i)j=(len-i)&(len-1),G[j]=G[j]+(F[j]*F[j]-conj(F[i]*F[i]))*Tmp;
  107.    
  108.     for(int i=0;i<len;++i)F[i]=comp(s[i]=='T',t[i]=='T');
  109.     DFT(F);
  110.     for(int i=0,j;i<len;++i)j=(len-i)&(len-1),G[j]=G[j]+(F[j]*F[j]-conj(F[i]*F[i]))*Tmp;
  111.  
  112.     for(int i=0;i<len;++i)F[i]=comp(s[i]=='G',t[i]=='G');
  113.     DFT(F);
  114.     for(int i=0,j;i<len;++i)j=(len-i)&(len-1),G[j]=G[j]+(F[j]*F[j]-conj(F[i]*F[i]))*Tmp;
  115.    
  116.     for(int i=0;i<len;++i)F[i]=comp(s[i]=='C',t[i]=='C');
  117.     DFT(F);
  118.     for(int i=0,j;i<len;++i)j=(len-i)&(len-1),G[j]=G[j]+(F[j]*F[j]-conj(F[i]*F[i]))*Tmp;
  119.    
  120.     IDFT(G);
  121.  
  122.     reverse(s,s+n);n>>=1;
  123.     for(int i=0;i<n;++i)Ans[i]=int(G[2*n-1-i].r+0.5);
  124.     // for(int i=0;i<n;++i)printf("%d ",Ans[i]);
  125.  
  126.     ll ans=0;
  127.     ll period=(ll)n/gcd(n,m)*m;
  128.     ll pos;
  129.     for(pos=0;pos<period;pos+=m){
  130.         ans+=Ans[pos%n];
  131.     }
  132.     ans*=(k/period);
  133.     ll remain=k%period;
  134.     for(pos=0;pos+n<remain;pos+=m){
  135.         ans+=Ans[pos%n];
  136.     }
  137.     for(;pos<remain;++pos){
  138.         ans+=(s[pos%n]==t[pos%m]);
  139.     }
  140.     printf("%lld\n",ans);
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement