這道題目讀完我就覺得這道題目很煩。搞得我都不想做了,但是還好。停了這麼多天總算把這個題目幹掉了。這個題目主要是輸入特別噁心。輸入的數據有回車,有空格所以不能用cin。C語言的文件操作可以說我是根本沒有掌握住過。看了一下解體報告的代碼,不是看他的思路而是看他的輸入是怎麼實現的。這道題目對我來說應該是有收穫的,至少讓我知道了scanf和printf的重定向。
我的解體思路是把所有的字母都找出來另外存起來。找回文字符串的時候直接從只有字母的串裏找。因爲最長不超過2000,所以我直接從最長的開始找,找不到就把長度減一繼續找。說白了就是暴力。找到以後根據字母所在的位置和字符串的長度到原字符串裏找到原來的字符串輸出。
題目鏈接:http://cerberus.delos.com:790/usacoprob2?a=aMfT0UnsZQM&S=calfflac
我的代碼:
/*
ID:sunexio2
PROG:calfflac
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <fstream>
using namespace std;
char str[20005], sttr[20005];
int str_len, sttr_len, ans_len;
int search(){
int p = sttr_len - ans_len;
int l = ans_len - 1;
for(int i = 0; i <= p; ++i){
for(int j = i, k = i + l; ; ){
if(sttr[j] != sttr[k])
break;
++j, --k;
if(j >= k)
return i;
}
}
--ans_len;
return search();
}
int main(){
freopen("calfflac.in", "r", stdin);
freopen("calfflac.out", "w", stdout);
str_len = sttr_len = ans_len = 0;
int i = 0, j = 0;
while(scanf("%c", &str[str_len]) != EOF){
if((str[str_len] >= 'a' && str[str_len] <= 'z'))
sttr[sttr_len++] = str[str_len];
if((str[str_len] >= 'A' && str[str_len] <= 'Z'))
sttr[sttr_len++] = str[str_len] - 'A' + 'a';
++str_len;
}
ans_len = 2000 > sttr_len? sttr_len : 2000;
int k = search();
for(i = 0, j = 0; j <= k; ++i)
if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
++j;
--i;
printf("%d\n", ans_len);
for(j = 0; j < ans_len; ++i)
{
printf("%c", str[i]);
if((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
++j;
}
printf("\n");
return 0;
}