zoukankan      html  css  js  c++  java
  • [Agc028A]Two Abbreviations_数学

    Two Abbreviations

    题目链接https://atcoder.jp/contests/agc028/tasks/agc028_a

    数据范围:略。


    题解

    题目中的位置非常不利于思考,我们令字符串的存储是从$0$开始。

    也就是说$S$的第$i$个字符相当于$(i - 1)cdot frac{L}{N}$

    手玩一下就会发现,题目中的$-1$,仅仅可能是两个串的字符应该出现在同一个位置,但是他俩不一样。

    而且,如果没有这样的不满足的位置,$L=lcm(N,M)$即可,这是显然的,因为每个字符间隔都在成倍增长。

    故此,暴力用$gcd$判一下即可。

    代码

    #include <bits/stdc++.h>
    
    #define N 3000010 
    
    using namespace std;
    
    char s[N], t[N];
    
    int main() {
        int n, m;
        cin >> n >> m ;
        scanf("%s%s", s + 1, t + 1);
        int d = __gcd(n, m);
        int n_ = n / d, m_ = m / d;
        for (int i = 0; i < d; i ++ ) {
            int k1 = i * n_ + 1, k2 = i * m_ + 1;
            if (s[k1] != t[k2]) {
                puts("-1");
                return 0;
            }
        }
        cout << (long long)n_ * m_ * d << endl ;
        return 0;
    }
    
  • 相关阅读:
    后缀自动机在复习
    冬令营模拟day2总结
    割点(模板)
    黑匣子
    挤牛奶
    上白泽慧音
    lca最小公共祖先祖先
    最小花费
    牛的旅行(标程)
    骑马修栅栏
  • 原文地址:https://www.cnblogs.com/ShuraK/p/11738359.html
Copyright © 2011-2022 走看看