zoukankan      html  css  js  c++  java
  • AtCoder Grand Contest 028 A:Two Abbreviations

    题目传送门:https://agc028.contest.atcoder.jp/tasks/agc028_a

    题目翻译

    给你两个串(s)(t),长度分别为(n,m)。问你存不存在一个串长度为(l)(l)(n,m)的公倍数,并且满足下面的条件:

    (1)、对于第(1)位、第(l/n+1)位,第(2*l/n+1)位……第((n-1)*l/n+1)位的字符串依次拼接等于(s)

    (2)、对于第(1)位、第(l/m+1)位,第(2*l/m+1)位……第((m-1)*l/m+1)位的字符串依次拼接等于(t)

    题解

    对于要求的串,真正有关系的位置总和不会超过(n,m)(lcm)。所以我们只需要判断对于某一位,满足它等于(a*l/n+1)也等于(b*l/n+1),然后看(s[a])(t[b])是否相等即可。如果全部都满足条件,那么就输出(lcm),否则输出(-1)

    时间复杂度:(O(n+m))

    空间复杂度:(O(n+m))

    代码如下:

    #include <map>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    const int maxn=1e5+5;
    
    ll l;int n,m;
    map<int,int>good;
    char s[maxn],t[maxn];
    
    int read() {
    	int x=0,f=1;char ch=getchar();
    	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    	for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    	return x*f;
    }
    
    int gcd(int a,int b) {
    	if(!b)return a;
    	return gcd(b,a%b);
    }
    
    int main() {
    	n=read(),m=read();
    	scanf("%s%s",s,t);
    	l=1ll*n*m/gcd(n,m);
    	for(int i=0;i<n;i++)
    		good[i*(l/n)+1]=s[i];
    	for(int i=0;i<m;i++)
    		if(good[i*(l/m)+1]&&good[i*(l/m)+1]!=t[i]) {
    			puts("-1");exit(0);
    		}
    	printf("%lld
    ",l);
    	return 0;
    }
    
  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/AKMer/p/10085349.html
Copyright © 2011-2022 走看看