【(DIV 2定格)教育Codeforcesラウンド81 B】無限プレフィックス

トピックリンク

[説明]


0,1、-1〜1のように
要求し、接頭辞。
事前[I] = [I事前 -1] +1
デルタを与える= [n]は事前に
各位置の[i]を事前の値には明らかであろう
再び再コピーの言葉。
位置の次の、すなわち、プレフィックスI +のNと明らかに事前[I] + delata
とても明らか場合無制限。
すなわち、予め[I] == x及びdelata == 0
ような状況限り、無限です。
他の例では、各位置は、すべての後に、または目標に向かって離れになります。
いいえ、それの整数倍の違いを見ることがないデルタ。
その場合、Xになることができます説明

[コード]

#include <bits/stdc++.h>
#define LL long long
using namespace std;

const int N = 1e5;

int n,x;
string s;
int pre[N+10];
//先考虑一个s的情况

int main(){
    #ifdef LOCAL_DEFINE
        freopen("E:\\rush.txt","r",stdin);
    #endif // LOCAL_DEFINE
    ios::sync_with_stdio(0),cin.tie(0);
    int T;
    cin >> T;
    while (T--){
        cin >> n >> x;
        cin >> s;
        int len = s.size();
        pre[0] = 0;
        for (int i = 0;i < len;i++){
            if (s[i]=='0')
                pre[i+1] = pre[i]+1;
            else
                pre[i+1] = pre[i]-1;
        }
        int delta = pre[len];
        bool inf = 0;
        LL ans = 0;
        for (int i = 0;i <= len;i++){
            if (pre[i]==x) ans++;
            if (pre[i]==x && delta==0)
                inf = 1;
            if (i!=0 && pre[i]<x && delta>0 && (x-pre[i])%delta==0) ans++;
            if (i!=0 && pre[i]>x && delta<0 && (pre[i]-x)%(-delta)==0) ans++;
        }
        if (inf) cout<<-1<<endl;else cout<<ans<<endl;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/AWCXV/p/12242091.html