求助!!!
查看原帖
求助!!!
987758
CaoSheng_zzz楼主2024/9/5 15:33

我的代码:

#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <bitset>
#include <queue>
#include <map>
#include <set>
#define prt printf
#define ll long long
#define spc putchar(' ')
#define ent putchar('\n')
#define pr_ prt("---")
#define prx prt("***")
#define prtn (putchar('N') , putchar('o'))
#define prty (putchar('Y') , putchar('e') , putchar('s'))
using namespace std;

inline int read(){
	int f = 1 , k = 0;
	char c = getchar();
	while(c < '0' || c > '9'){
		if(c == '-') f = -1;
		c = getchar() ;
	}
	while(c >= '0' && c <= '9'){
		k = (k << 3) + (k << 1) + (c ^ 48);
		c = getchar() ;
	}
	return (f == 1 ? k : -k);
}

void output(int now){
	if(now < 0){
		putchar('-');
		output(- now);
	}
	else{
		if(now > 9) output(now / 10);
		putchar((now % 10) ^ 48);
	}
}

const int maxn = 51 ;
char s[maxn] ;
int f[maxn][maxn] ;
int n ;

bool Che2(int num) { while(num > 1){ if(num & 1) return false ; num >>= 1 ;} return true ;}

bool Check(int l , int r , int len) {
	if((r - l + 1) % len) return false ;
	if(Che2((r - l + 1) / len) == false) return false ;
	for(int i=0 ; i<len ; i++) {
		for(int j=l ; j<=r ; j+=len) { if(s[l + i] != s[j + i]) return false ;}
	}
//	output(l) , spc , output(r) , spc , output(len) , ent ;
	return true ;
}

int _log(int num) { int res = 0 ; while(num > 1) { ++ res ; num >>= 1 ;} return res ;}
int Min(int a , int b) { return a < b ? a : b ;}

signed main() {
	while((s[++ n] = getchar()) && (s[n] != ' ') && (s[n] != '\n')) ;
	for(int i=1 ; i<n ; i++) for(int j=i ; j<n ; j++) f[i][j] = i == j ? 1 : 0x3f3f3f ;
	for(int len=2 ; len<n ; len++) {
		for(int l=1 ; l<=n-len ; l++) {
			int r = l + len - 1 ;
			for(int pos=l ; pos<=r ; pos++) {
				if(Check(l , r , pos - l + 1) == true) f[l][r] = Min(f[l][r] , f[l][pos] + _log((r - l + 1) / (pos - l + 1)) + (l != 1)) ;	
				f[l][r] = Min(f[l][r] , f[l][pos] + f[pos + 1][r]) ;
			}
		}
	}
//	for(int i=1 ; i<n ; i++) {
//		for(int j=i ; j<n ; j++) output(f[i][j]) , spc ;
//		ent ;
//	}
	return output(f[1][n - 1]) , ent , 0 ;
}

思路是区间dp板子加上字符串进行匹配就是判断字符串相不相同,还有压缩的 字符串中必须要有2的幂次个小字符串相同

2024/9/5 15:33
加载中...