首页 > 代码库 > BestCoder Round #87 1002 Square Distance[DP 打印方案]
BestCoder Round #87 1002 Square Distance[DP 打印方案]
Square Distance
Accepts: 73
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
一个字符串被称为square当且仅当它可以由两个相同的串连接而成. 例如, "abab", "aa"是square, 而"aaa", "abba"不是.两个长度相同字符串之间的hamming distance是对应位置上字符不同的位数.Alex有个偶数长度的字符串ss1s2...sns=s?1??s?2??...s?n??. 他想要找到一个字典序最小的square tt1t2...tnt=t?1??t?2??...t?n?? 使得ss和tt之间的hamming distance恰好是mm. 另外, ss和tt仅包含小写英文字母.
输入描述
输入包含多组数据, 第一行包含一个整数TT 1T500(1≤T≤500)表示测试数据组数. 对于每组数据:第一行包含两个整数nn和mm 1n10000mnn(1≤n≤1000,0≤m≤n,n is even)表示字符串的长度和hamming distance. 第二行包含一个字符串ss.
输出描述
对于每组数据, 如果不存在这样的一个square, 输出"Impossible" (不包含引号). 否则, 输出字典序最小的square.
输入样例
34 1abcd4 2abcd4 2abab
输出样例
Impossibleababaaaa
因为要字典序最小打印,所以倒着保存状态
f[i][j]表示i到n/2且hamming distance为j是否可行
DP一遍之后贪心从头开始选择就行了
//// main.cpp// bc87-1002//// Created by Candy on 10/1/16.// Copyright © 2016 Candy. All rights reserved.//#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>#include <string>using namespace std;const int N=1005,V=1e6+5;inline int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x;}int T,n,m,l,d[N][N];//dao xuchar s[N],t[N];void dp(){ memset(d,0,sizeof(d)); d[l+1][0]=1; for(int i=l;i>=1;i--) for(int j=0;j<=m;j++){ if(s[i]==s[i+l]) { d[i][j]|=d[i+1][j]; if(j>=2) d[i][j]|=d[i+1][j-2]; }else{ if(j>=1) d[i][j]|=d[i+1][j-1]; if(j>=2) d[i][j]|=d[i+1][j-2]; } //printf("d %d %d %d\n",i,j,d[i][j]); } if(!d[1][m]){printf("Impossible\n");return;} int res=m; for(int i=1;i<=l;i++) for(int k=0;k<26;k++){ int tmp=(s[i]-‘a‘!=k)+(s[i+l]-‘a‘!=k); if(d[i+1][res-tmp]){ t[i]=t[i+l]=k+‘a‘; res-=tmp; break; } } for(int i=1;i<=n;i++) putchar(t[i]); putchar(‘\n‘);}int main(int argc, const char * argv[]) { T=read(); while(T--){ n=read();m=read(); l=n/2; scanf("%s",s+1); dp(); } return 0;}
BestCoder Round #87 1002 Square Distance[DP 打印方案]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。