USACO cafflac

2961 ワード

原文:
http://972169909-qq-com.iteye.com/blog/1084418
1、入力を処理する時、〹include<ctype.h>の3つの関数を使って、便利ですばやいです。
          if(!isalpha(buf[i]))//      
       
   if(isupper(buf[i])){//        
str[k++] = tolower(buf[i]);  //       
2、他に注意したいのは
3、マッピングの配列を定義して便利に処理する
char buf[MAX], str[MAX];//buf       ,str  buf     
int map[MAX];           //map  str    buf    
4、fgetsを使って改行とスペースを読み込み、文字列につづり合わせる
    while(fgets(tp, sizeof(tp), stdin)){//fgets        
      strcat(buf,tp);
    }
コード:
/*
ID: nenusb1
LANG: C++
TASK: calfflac 
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>//int isalpha(int ch), isupper(),tolower()
#define MAX 20000+5 
using namespace std;

char buf[MAX], str[MAX];//buf       ,str  buf     
int map[MAX];           //map  str    buf     

int main(){
    freopen("calfflac.in","r",stdin);
    freopen("calfflac.out","w",stdout);
    
    //    80    
    char tp[80+5];
    int len,i,j;
    int maxs = 0, start = 0, end = 0,k = 0;
    
    //************   ********************** 
    while(fgets(tp, sizeof(tp), stdin)){//fgets        
      strcat(buf,tp);
    }
    len = strlen(buf);
//    printf("%d
", len);          for(i=0; i<len; i++){           if(!isalpha(buf[i]))             continue;           map[k] = i;//buf[i] str[k]            if(isupper(buf[i])){                str[k++] = tolower(buf[i]);                               }else{                str[k++] = buf[i];            }     }  // k str      // printf("%d
",k);          //************* str , *************      for(i=0; i<k; i++){//  i            j=0;           while(1){               if(i-j<0 || i+j>=k || str[i-j] != str[i+j] )   {                       break;               }else{                    int temp = j*2 + 1;// :BBABB                    if(temp > maxs){                          start = i-j;                          end = i+j;                          maxs = temp;                            }               }               j++;            }                      j=0;           while(1){               if(i-j<0 || i+j+1>=k || str[i-j] != str[i+j+1] )   {                       break;               }else{                    int temp = (j+1)*2;// :BAAB                    if(temp > maxs){                          start = i-j;                          end = i+j+1;                          maxs = temp;                            }               }               j++;            }                           }     printf("%d
",maxs);          for(i=map[start]; i<=map[end]; i++){           printf("%c",buf[i]);     }     printf("
");               return 0; }