Jeanny
寂兮,寥兮,独立不改,周行而不殆

枚举颜色, 枚举第几个该颜色,l、r,计算l-r的最小交换次数,每两个的交换次数是:p[i][ra] - p[i][la] - 1 - (ra-la-1);
wrong:

#include <bits/stdc++.h>
using namespace std;
int n, m, num[30], p[30][55], ans;
char s[55];
int main() {
    scanf("%d%s%d", &n, s, &m);
    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        p[s[i] - 64][++num[s[i] - 64]] = i;
    }
    for (int i = 1; i <= 26; i++) {
        for (int l = 1; l <= num[i]; l++) {
            for (int r = l; r <= num[i]; r++) {
                int sum = 0;
                sum = p[i][r] - p[i][l] - 1 - (r - l - 1);//只算了边上的两个
                if (sum > m)
                    continue;
                else
                    ans = max(ans, r - l + 1);
            }
        }
    }
    cout << ans << endl;
    return 0;
}
/*
11
ABCADABEDDA
8
*/
#include<bits/stdc++.h>
using namespace std;
int n,m, num[30], p[30][55], ans;
char s[55];
int main(){
	scanf("%d%s%d",&n,s,&m);
	int len = strlen(s);
	for(int i = 0; i < len; i++){
		p[s[i]- 64][++num[s[i] - 64]] = i;
	}
	for(int i = 1; i <= 26; i++){//
		for(int l = 1; l <= num[i]; l++){
			for(int r = 1; r <= num[i]; r++){//
				int ra = r, la = l, sum = 0, fl = 0;
				while(la < ra){
					sum += p[i][ra] - p[i][la] - 1 - (ra-la-1);
					if(sum > m) {
						fl = 1;break;
					}
					la++, ra--;
				}
				if(!fl) ans = max(ans, r-l+1);	
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
/*
11
ABCADABEDDA
8

9
ABBABABBA
3

4


7
BBABABB
3

4



4
ZWYZ
2
*/

优化:尺取法

#include <bits/stdc++.h>
using namespace std;
int n, m, num[30], p[30][55], ans;
char s[55];
int main() {
    scanf("%d%s%d", &n, s, &m);
    int len = strlen(s);
    for (int i = 0; i < len; i++) {
        p[s[i] - 64][++num[s[i] - 64]] = i;
    }
    for (int i = 1; i <= 26; i++) {  //
        for (int l = 1, r = 1; r <= num[i];) {
            int ra = r, la = l, sum = 0;
            while (la < ra) {
                sum += p[i][ra] - p[i][la] - 1 - (ra - la - 1);
                la++, ra--;
            }
            if (sum > m)
                l++;
            else {
                ans = max(ans, r - l + 1);
                r++;
            }
        }
    }
    cout << ans << endl;
    return 0;
}
posted on 2023-08-05 16:50  Jeanny  阅读(18)  评论(0)    收藏  举报