记录编号 |
137998 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
神奇的压缩机 |
最终得分 |
100 |
用户昵称 |
Iostream3100 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.186 s |
提交时间 |
2014-11-05 15:56:12 |
内存使用 |
0.33 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN=4100;
int A,B,next[MAXN],f[MAXN];
string s;
void prework(void){
memset(next,0,sizeof(next));
for(int i=0;i<s.size();++i){
for(int j=0;j<i;++j){
int tot=0,k=j;
while(i+tot<s.size()&&s[k]==s[i+tot]){
++tot;
++k;
if(k>=i) k=j;
}
next[i]=max(next[i],tot);
}
}
// for(int i=0;i<s.size();++i) cout<<i<<": "<<next[i]<<endl;
}
void init(void){
cin>>s;
cin>>A>>B;
}
void work(void){
prework();
memset(f,127/3,sizeof(f));
f[0]=0;
for(int i=0;i<s.size();++i){
f[i]=f[i-(i>0)]+A;
for(int j=0;j<i;++j){
if(next[j]+j-1>=i) f[i]=min(f[i],(j>0? f[j-1]:0)+B);
}
}
}
void print(void){
// for(int i=0;i<s.size();++i) cout<<i<<"? "<<f[i]<<endl;
cout<<f[s.size()-1]<<endl;
}
int main(){
freopen("WinCHG.in","r",stdin);
freopen("WinCHG.out","w",stdout);
init();
work();
print();
}