usaco-1.3.4 Calf Flac

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值