欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-08 21:18:48
...

G-字符串哈希

题目:

【比赛回顾】广工2020程序设计初赛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;
}

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

相关标签: 比赛回顾