表示以前作比赛的时候没有做出来,原因不堪回收~是看不懂测试数据,所以就没有做了,前两天回看了一下,才知道如此简单。
就是一个回文词,但是要从中间开始找,用一个数组记录字母的位置,记得把大写转换为小写。
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char q[1008],s[1008];
int w[1008];
int main(){
int k,i,j,sum,maxx;
int ant,ans=1;
int left;
while(~scanf("%d",&k)){
getchar();
maxx=0;
left=0;
gets(s);
memset(w,0,sizeof(w));
int len=strlen(s);
sum=0;
for(i=0;i<len;i++){
if((s[i]>='a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')){
if(s[i] >= 'A' && s[i] <= 'Z'){
s[i]+=32;
}
q[sum]=s[i];
w[sum++]=i;
}
}
//printf(" %d %d\n",len,sum);
for(i=0;i<sum;i++){
ant=0;
for(j=0;i+j < sum && i-j >=0 ;j++){
if(q[i-j] != q[i+j]) ant++;
if(ant > k) break;
}
j--;
if(w[i+j]-w[i-j] +1> maxx){
maxx=w[i+j]-w[i-j]+1;
left=w[i-j];
}
ant=0;
for(j=1;i+j< sum && i-j+1>=0 ;j++){
if(q[i+j] != q[i-j+1]) ant++;
if(ant > k) break;
}
j--;
if(j <= 0) continue;
if(w[i+j]-w[i-j+1]+1 > maxx){
maxx=w[i+j]-w[i-j+1]+1;
left=w[i-j+1];
}
//printf(" Case %d: %d %d\n",ans++,maxx,left+1);
}
printf("Case %d: %d %d\n",ans++,maxx,left+1);
}
return 0;
}
坚持中......