首页 > 其他分享 >思考 Count The Repetitions,谈谈对 T2乒乒球的认识

思考 Count The Repetitions,谈谈对 T2乒乒球的认识

时间:2024-07-09 17:58:30浏览次数:13  
标签:Count 乒乒 int ll Repetitions cin start now inv

思考什么什么不写

题意

共记录了 \(n\) 颗球胜负关系,给出 \(n\) 和其长度为 \(k\) 的循环节,求最终比分。

思路

首先特判答案为 \(0:0\) 的情况:循环节与 ABABBA 同构。然后暴力找比分的周期,因为令任意位置作为一局起点时该局终点唯一,反之亦然,所以复杂度 \(O(\left| state \right|k)\)。

Code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

signed main() {
    cin.tie(0) -> sync_with_stdio(false);
    ll n; int k; cin >> n >> k;
    string s; cin >> s; s = ' ' + s;
    auto ck = [&]() {
        vector<int> v(k + 1);
        for (int i = 1; i <= k; i++) v[i] = v[i - 1] + 2 * (s[i] == 'A') - 1;
        return abs(v[1] - v[k]) == 1 && find(v.begin(), v.end(), 2) == v.end();
    };
    if (ck()) {
        cout << "0:0" << '\n';
        return 0;
    }
    vector<int> inv(k + 1);
    auto P = [&](int i) {
        return (i - 1) % k + 1;
    };
    array<unordered_map<int, int>, 2> C;
    array<int, 2> c{0, 0};
    int now = 1;
    while (!inv[P(now)]) {
        inv[P(now)] = now;
        int a = 0, b = 0;
        for (int j = now; ; j++) {
            a += s[P(j)] == 'A';
            b += s[P(j)] == 'B';
            if (max(a, b) >= 11 && abs(a - b) >= 2) {
                C[0][j] = (c[0] += a > b);
                C[1][j] = (c[1] += b > a);
                now = j + 1;
                break;
            }
        }
    }
    int start = inv[P(now)];
    int interval = now - start;
    ll repeat = (n - start + 1) / interval;
    ll patternCntA = (C[0][now - 1] - C[0][start - 1]) * repeat;
    ll patternCntB = (C[1][now - 1] - C[1][start - 1]) * repeat;
    int remain = start - 1 + (n - start + 1) % interval;
    int remainCntA = 0, remainCntB = 0;
    int a = 0, b = 0;
    for (int i = 1; i <= remain; i++) {
        a += s[P(i)] == 'A';
        b += s[P(i)] == 'B';
        if (max(a, b) >= 11 && abs(a - b) >= 2) {
            remainCntA += a > b;
            remainCntB += b > a;
            a = b = 0;
        }
    }
    cout << patternCntA + remainCntA << ':' << patternCntB + remainCntB << '\n';
    return 0;
}

reference:

Leetcode 466. 统计重复个数【寻找循环节,双百提交,解释非常详细】- MD_

标签:Count,乒乒,int,ll,Repetitions,cin,start,now,inv
From: https://www.cnblogs.com/wkh2008/p/18292421

相关文章

  • LDAP 用户帐户控制 UserAccountControl 详解
    属性标志十六进制值十进制值属性标志说明SCRIPT0x00011将运行登录脚本ACCOUNTDISABLE0x00022已禁用用户帐户HOMEDIR_REQUIRED0x00088需要主文件夹LOCKOUT0x001016 PASSWD_NOTREQD0x002032无需密码PASSWD_CANT_CHANGE0x004064用户无法更改......
  • [UVM]IC验证自动结束仿真函数——uvm_top.set_timeout/set_report_max_quit_count
    Title:[UVM]IC验证自动结束仿真函数——uvm_top.set_timeout/set_report_max_quit_count文章目录1-前言2-uvm_top.set_timeout3-set_report_max_quit_count4-运用5-小结1-前言​数字IC验证过程中,需要运行不同Testcase,有些TC会因为TC配置、TB机制等原因,导致m......
  • SQL Server 实现类似CountIF的函数
    需求说明:我有一个客户表,还有一个客户的体验记录表,我需要汇总客户体验信息如下:客户名称,本周体验次数,本月体验次数,本年度体验次数,累计体验次数,首次体验时间,最近体验时间 信息,如何用一个SQL语句搞定:COUNT函数官方说明:指定COUNT返回唯一非Null值的数量。所以变相实现如下:S......
  • E. Final Countdown
    原题链接题解由于数位很大,所以要朝着数位方向想,对于从左到右数第\(i\)位,其贡献为\([1,i-1]\)位组成的数字*10+\(s_i\),等于\([1,i]\)区间放到了答案的\([n-i+1,n]\)code#include<bits/stdc++.h>usingnamespacestd;inta[400005]={0};intmain(){intt;......
  • 【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
    问题描述iOS Objective-C应用,连接AzureStorageAccount,根据官网Example代码,在没有关闭StorageAccount的匿名访问时,程序正常运行。但是,只要关闭了匿名访问,上传blob到Container中,就会报错:Publicaccessisnotpermittedonthisstorageaccount  问题解答查看示例......
  • Two-factor authentication (2FA) is required for your GitHub account
    今天在尝试打开GitHub页面时,突然出现了一个错误提示:“Two-factorauthentication(2FA)isrequiredforyourGitHubaccount”(如图所示)。这个错误提示表明,GitHub账户需要启用双因素认证(2FA)才能继续使用。在网上找了一些办法可以解决但是太麻烦找了比较简单的方法  ......
  • CyclicBarrier、CountDownLatch、Semaphore 的用法
    CyclicBarrier、CountDownLatch、Semaphore的用法1.CountDownLatch(程序计数器)CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。fi......
  • verilog写12 小时时钟(带上午/下午指示器)计数器(HDLbits Count clock)
    Createasetofcounterssuitableforuseasa12-hourclock(witham/pmindicator).Yourcountersareclockedbyafast-running clk,withapulseon ena wheneveryourclockshouldincrement(i.e.,oncepersecond).reset resetstheclockto12:00AM.......
  • 深探Java线程池协同神器——CountDownLatch的源码奥秘与实战应用
    1.概述CountDownLatch,作为Java并发包java.util.concurrent下的重要一员,其设计理念在于提供一个线程同步工具,允许一个或多个线程等待其他线程完成操作后再继续执行。在工程师的眼中,它不仅是多线程编程中的一把利器,更是实现线程间高效协同的关键所在。2.源码分析构造函......
  • [题解]AT_abc248_d [ABC248D] Range Count Query
    思路其实很简单,我们可以将所有数值相同的值的下标存入一个vector里面。因为,我们既然要查找\(X\),不妨把所有值为\(X\)的下标存在一起,方便查找。(可以在输入的时候完成)我们不妨在每一个数值后面添加一个哨兵,然后二分查找第一个大于等于\(l\)的数和第一个大于等于\(r+1\)......