这道又是一道典型的动态规划题。通过对题目的分析,我们可以写出这道题动态规划的算法如下。
if (chan[i]==chan[i-ans[i-1]-1]){
ans[i]=ans[i-1]+2;
}
else if (chan[i]==chan[i-1]){
ans[i]=2;
}
else {
ans[i]=1;
}
接着,我们所需要的就是将原有的输入字符串变成“干净”的字符串,即仅有小写字母的串。做完判断后,再将其还原成原字符串输出即可。代码如下。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char change(char t){
if (t>='A'&&t<='Z'){
t=t-'A'+'a';
}
return t;
}
int main (){
freopen ("clafflac.in","r",stdin);
freopen ("clafflac.out","w",stdout);
char x[20005],c,chan[20005];
int max=0,st=0,en=0,ans[20005];
int i=0,tot=1,cnt=1,k=1;
while (true){
c=getchar();
if(c == EOF){
break;
}
x[tot++]=c;
}
x[tot]='\0';
for (i=1;i<=tot;i++){
if ((x[i]>='a'&&x[i]<='z')||(x[i]>='A'&&x[i]<='Z')){
chan[cnt++]=change(x[i]);
}
}
for (i=1;i<=cnt;i++){
if (chan[i]==chan[i-ans[i-1]-1]){
ans[i]=ans[i-1]+2;
}
else if (chan[i]==chan[i-1]){
ans[i]=2;
}
else {
ans[i]=1;
}
if (ans[i]>max){
max=ans[i];
if ((i-(i-ans[i-1]-1))==(en-st)){
continue;
}
st=i-ans[i-1]-1;
en=i;
}
}
cout<<max<<endl;
for (i=1;i<=tot;i++){
if ((x[i]>='a'&&x[i]<='z')||(x[i]>='A'&&x[i]<='Z')){
k++;
}
if (k>st){
cout<<x[i];
}
if (k>en){
break;
}
}
cout<<endl;
return 0;
}