一种基于四重循环的暴力过题方式。
查看原帖
一种基于四重循环的暴力过题方式。
396748
apxitye楼主2023/11/29 22:26
#include<bits/stdc++.h>
#define lfor(i,a,b) for(int i=a;i<=b;i++)
#define int long long
using namespace std;
int pref[10][50][50][10];

signed main(){
    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    string s[n + 10];
    for(int i = 1;i <= n;i++)  cin >> s[i];
    for(int i = 1;i <= n;i++){
        int k = 0;
        int len = s[i].size();
        for(int j = 0;j < len;j++) k += s[i][j] - '0';
        int t = 0;
        for(int j = 0;j < len;j++) t += s[i][j] - '0',pref[len][k][t][j + 1]++;
    }
    int sum = n;
    for(int i = 1;i <= 5;i++){
        for(int j = 1;j <= 5;j++){
            if((i + j) % 2 != 0) continue;
            int len = (i + j) / 2;
            for(int ksum = 2;ksum <= 90;ksum += 2){
                int val = ksum / 2;
                for(int k1 = 1;k1 <= 45;k1++){
                    int k2 = ksum - k1;
                    if(k2 > 45) continue;
                    if(i > j and k1 > val){
                        sum += pref[i][k1][val][len] * pref[j][k2][k2][j];
                    }
                    else if(i == j and k1 == val){
                        int c = pref[i][k1][k1][i];
                        sum += c * (c - 1);
                    }
                    else if(i < j and k1 < val){
                        sum += pref[i][k1][k1][i] * pref[j][k2][k2-val][len-i];
                    }
                }
            }
        }
    }
    cout << sum << endl;
    return 0;
}

pref第一维代表串的长度,第二维代表串的总和,第四维代表串的前多少位,第三位代表前多少位的前缀和,pref的值代表这样的串有多少种。

接着进行两个串的拼接,i,j分别枚举长度,ksum枚举两串总和,k1枚举第一个串的总和。

而枚举量为5590*45 = 101250 = 1e5

过辽~

2023/11/29 22:26
加载中...