【Educational Codeforces Round 81 (Rated for Div. 2) B】Infinite Prefixes


題目鏈接

【題解】

把0看成是1,把1看成是-1 求一個前綴和。 pre[i] = pre[i-1]+1 得到delta = pre[n] 顯然對於每個位置的值pre[i] 再復制一遍s的話。 下一個s的該位置,也即i+n的前綴和顯然為pre[i]+delata 那么無限的情況就很顯然了。 即pre[i]==x,而且delata==0. 只要出現一個這種情況,就是無限。 其他情況,每個位置都會朝着目標遠離或者畢竟。 看看差值不是不是delta的整數倍就可以了。 如果是的話,說明可以變成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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM