题目链接: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;
}
原文:https://www.cnblogs.com/ShuraK/p/11738359.html