【比赛回顾】广工2020程序设计初赛G-字符串哈希
程序员文章站
2022-04-08 21:18:48
...
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;
}