USACO Calf Flac

    這個題的大概意思是:給你一個字符串(簡單的處理)(小於20000),找出最長的迴文子串,再輸出它在原文中的位置。
    這個題常規的想法是,窮舉,時間複雜讀O(n^2)<--不可取。還有一種就是窮舉迴文字串的中點,時間複雜度相當於O(n)。
下面是代碼:
#include<stdio.h>

struct save{
char ch;
int i;
};
save ar[20005];
char s,str[20005];
int n,Max,begin,end;

void deal1(int x){
int i,j,sum=1;
for(i=x-1,j=x+1;i>=0 && j<n && ar[i].ch==ar[j].ch;i--,j++)sum+=2;
if(sum>Max){
Max=sum;
begin=ar[i+1].i;end=ar[j-1].i;
}
}

void deal2(int x){
int i,j,sum=0;
for(i=x,j=x+1;i>=0 && j<n && ar[i].ch==ar[j].ch;i--,j++)sum+=2;
if(sum>Max){
Max=sum;
begin=ar[i+1].i;end=ar[j-1].i;
}
}

void make(){
int i;
Max=begin=end=0;
for(i=0;i<n;i++){
deal1(i);//子串爲奇數
deal2(i);//子串爲偶數
}
}
int main(){
int i,j=0,t,k=0;
FILE *fin=fopen("calfflac.in","r");
FILE *fout=fopen("calfflac.out","w");
while(fscanf(fin,"%c",&s)!=EOF){
str[k++]=s;
if((s<='z' && s>='a') || (s<='Z' && s>='A'))//處理
{
if(s<'a')
s+=32;
ar[j].ch=s;
ar[j++].i=k-1;
}
}
n=j;
make();
fprintf(fout,"%d\n",Max);
for(i=begin;i<=end;i++)
fprintf(fout,"%c",str[i]);
fprintf(fout,"\n");
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章