这道题目读完我就觉得这道题目很烦。搞得我都不想做了,但是还好。停了这么多天总算把这个题目干掉了。这个题目主要是输入特别恶心。输入的数据有回车,有空格所以不能用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;
}