UVa10602 - Editor Nottoobad
题目大意
给定N个单词,要求你用Nottoobad编辑器进行输入,如果你当前需要输入的单词与之前一个已经输入的单词有公共部分,那么这公共部分是不需要输入的,只需要粘贴复制即可,第一个单词必须全部输入,其他的单词可以按任意顺序输入,要求你安排一个输入顺序,使得输入操作的次数最少。
题解
一个很简单的贪心,每次输入选择与前一个输入的单词的公共部分长度最长的单词即可,如果公共部分为0,则输入任意一个单词都行。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXN 105 int f[MAXN]; char s[MAXN][MAXN],ss[MAXN][MAXN]; long ans; int main(void) { int i,j,n,T,t,maxs,k; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(f,0,sizeof(f)); for(i=0; i<n; i++) { getchar(); scanf("%s",s[i]); } ans=strlen(s[0]); strcpy(ss[0],s[0]); f[0]=1; for(i=1; i<n; i++) { maxs=0; for(j=0; j<n; j++) if(!f[j]) { t=0; while((s[j][t]==ss[i-1][t])&&(t<strlen(ss[i-1]))) t++; if(t>maxs) { k=j; maxs=t; } } if(maxs) { ans+=strlen(s[k])-maxs; strcpy(ss[i],s[k]); f[k]=1; } else { k=1; while(f[k]&&k<n) k++; if(k<n) { ans+=strlen(s[k]); strcpy(ss[i],s[k]); f[k]=1; } } } printf("%ld\n",ans); for(i=0; i<n; i++) printf("%s\n",ss[i]); } return 0; }