【比赛回顾】广工2020程序设计初赛G-字符串哈希

这篇博客回顾了广工2020程序设计初赛中的G-字符串哈希问题。作者指出,尽管题目的描述较为复杂,但实际解题并不困难,主要考验编程基本功。文章提供了AC代码,并附有详细注释。
摘要由CSDN通过智能技术生成

G-字符串哈希

题目:

在这里插入图片描述


问题分析:

这是我写过最凌乱的代码了,为了AC不顾一切hhhh,其实题目并不难理解,但就是题目字太多太绕了。但其实没有什么难度,就是按照要求将文字翻译成代码而已,实际上考验的还是基本功,下面的代码我加了详细的注释


AC代码:

#include <bits/stdc++.h>
using namespace std;

//这个没有严谨的说法
//我只是为了存储后面的特殊情况,找的一个比较后的地址而已 
#define k 1000

int main()
{
	//s存放的是一个个单词
	//其实这个2000我是随便起的
	//但我很怕越界,因为题目有说最大全部字母加起来100000个
	//按照特别奇葩的数据 即一个字母一个单词,最多有100000个单词 
	//一开始我取的是150000,可是太多了,根本运行不了 
	//其实应该取133333是最准确的,因为最多1000000个单词和33333个合并字符串储存空间 
	//我就想取小点,看能不能AC先把,就取2000了 
	char s[2000][254];
	
	// 因为s不能太大,我就专门起了一个s1来临时记录拼接的单词了 
	char s1[2000][254];
	
	//清零 
	memset ( s,0,sizeof(s) );
	memset ( s1,0,sizeof(s1) );
	
	int n;
	cin >> n;
	int i=1,j=1;
	
	//读入数据 
	for ( i=1; i<=n; ++i )
		cin >> s[i];
		
	int times=n/3;
	int index = 1;
	
	//计算次数并逐次输出 
	while ( times-- )
	{
		//每三个单词拼接成一个临时s1 
		for ( i=1; i<=3; ++i )
			strcat(s1[index],s[j++]);
			
		//偷懒直接使用C++自带的反转函数 
		reverse(s1[index],s1[index]+strlen(s1[index]) );
		
		//输出第一个字母 
		cout << s1[index][0]; 
		
		//计算中间的数值有没有超 
		int len=strlen(s1[index]);
		if ( (len-2)>9 )
		{
			//若大于9则计算中间位数的位数 
			int num=0;
			while ( len>0 )
			{
				num++;
				len/=10;
			}
			cout << num;
		}
		else
		//否则就直接输出 
			cout << len-2;
			
		//输出最后一个字母 
		cout << s1[index][strlen(s1[index])-1] << endl;
		
		//下标加一 指向下一个拼接字符串 
		++index;
	}
	
	
	
	
	//有的情况会有余1—2个单词,分别考虑 
	if ( n%3 == 1 )
	{
		strcat(s1[k],s[j]);
		
		//按照题目要救加上 "pmznb"
		strcat(s1[k],"pmznb");
		strcat(s1[k],"pmznb");
		
		//下面的操作和上面的一模一样,其实可以封装成函数,
		//但懒得考虑了hh还是copy来的快一点 
		reverse(s1[k],s1[k]+strlen(s1[k]) );
		cout << s1[k][0]; 
		int len=strlen(s1[k]);
		if ( (len-2)>9 )
		{
			int num=0;
			while ( len>0 )
			{
				num++;
				len/=10;
			}
			cout << num;
		}
		else
			cout << len-2;
		cout << s1[k][strlen(s1[k])-1] << endl;
	}
	
	//下同余1的情况 
	if ( n%3 == 2 )
	{
		strcat(s1[k],s[j++]);
		strcat(s1[k],s[j++]);
		strcat(s1[k],"pmznb");
		reverse(s1[k],s1[k]+strlen(s1[k]) );
		cout << s1[k][0]; 
		int len=strlen(s1[k]);
		if ( (len-2)>9 )
		{
			int num=0;
			while ( len>0 )
			{
				num++;
				len/=10;
			}
			cout << num;
		}
		else
			cout << len-2;
		cout << s1[k][strlen(s1[k])-1] << endl;
	}
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值