比赛 EYOI与SBOI开学欢乐赛13th 评测结果 AWAAAAAAAAAAAAAAAAWAAWWAWWAAAAAAAAAAWWWAW
题目名称 折叠字符串(Folding) 最终得分 75
用户昵称 ZRQ 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-10-21 19:57:49
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=205;
char s[N];
int dp[N],n,lst[N],cnt[N],ansl[N],ansr[N],tot[N],top,len[N];
bool check(int st,int ed,int l,int r)
{
	if((r-l+1)%(ed-st+1)!=0) return 0;
	int len=ed-st+1;
	for(int i=l;i<=r;++i)
		if(s[st+(i-l)%len]!=s[i]) return 0;
	return 1;
}
void print()
{
	int cur=n;
	while(cur)
	{
		ansl[++top]=lst[cur]+1;
		ansr[top]=lst[cur]+len[cur];
		tot[top]=cnt[cur];
		cur=lst[cur];
	}
	while(top)
	{
		if(tot[top]>1) printf("%d(",tot[top]);
		for(int i=ansl[top];i<=ansr[top];++i) printf("%c",s[i]);
		if(tot[top]>1) printf(")");
		--top;
	}
}
int work(int k)
{
	int res=0;
	while(k) k/=10,++res;
	return res;
}
int main()
{
	freopen("folding.in","r",stdin);
	freopen("folding.out","w",stdout); 
	memset(dp,0x3f,sizeof(dp));
	scanf("%s",s+1);
	n=strlen(s+1);
	dp[0]=0;
	dp[1]=1;
	lst[1]=0;
	len[1]=1;
	cnt[1]=1;
	for(int i=2,calc;i<=n;++i)
		for(int l=1;l<=i;++l)
			for(int r=l;r<=i;++r)
				if(check(l,r,r+1,i))
				{
					calc=dp[l-1]+r-l+1;
					if(r!=i) calc+=2+work((i-l+1)/(r-l+1));
					if(calc<dp[i]) dp[i]=calc,lst[i]=l-1,len[i]=r-l+1,cnt[i]=(i-l+1)/(r-l+1);
				}
	print();
	return 0;
}