arc110b

arc110b

大意

给定一个长为 (N) 且仅有 (0,1) 的串,问:

给定串在 (10^{10})(110) 首尾相接连成的串中出现了几次(位置可以有重复!)

思路

第一次以为不能重复...不看样例的后果

先考虑最特殊的情况,给定串为 (1) ,此时答案是 (2*10^{10})

然后以第一个 (110) 的三个位置为开头,必须要能够匹配,否则不存在。

不妨假设在第一个 (110)(0) 处开始,并完成了匹配。

那么一次匹配跨越的 (110) 的个数显然为 (num=(2+n+2)/3) 向下取整。

然后,我们删去第一个 (110) ,因为排除最特殊的情况后,一个 (110) 不可能同时作为开头两次。

最后答案显然为 (10^{10}-num+1)

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)

const int mod = 998244353;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

string a;
int n;
char t[3] = {'1', '1', '0'};
ll l = 0;

int main() {
    bool flag=0;
    cin >> n >> a;
    if(a == "1" ) {
        cout << (ll)(2*1e10) << endl;
        return 0;
    }
    for(int i=0; i<3; i++) {
        for(int j=0; j<n; j++) {
            if(t[(i+j)%3] != a[j]) break;
            if(j == n-1) flag=1;
        }
        if(flag) {
            ll ans = 1e10 - (n+i+2)/3 + 1;
            cout << ans << endl;
            return 0;
        }
    }
    cout << 0 << endl;
    return 0;
}

-2,40min

原文地址:https://www.cnblogs.com/ullio/p/14117316.html