比赛 |
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;
}