【C++】henuACM暑期培训 新生训练赛2

D题 吃鸡战场(HDU 1047)

题目

经历了一天一夜的战斗,特种兵小A终于在学校楼顶追上了一个空投,正当小A迫不及待的上前去舔空投的时候,发现空投外面有一个密码箱,输入密码正确即可获得吉利服一套,AWM一把,8倍镜一个。题目这样描述:给出若干数,计算这些数字的和。由于小A没上过学,现在请你帮他解决这个难题。演习即将开始 加油,特种兵!

Input

第一行一个整数T,代表测试组数。
输入将包含最多100行文本,每行包含一个数。每个数的长度不超过100个字符,并且只包含数字(数都是非负数)。每行输入的数作为一个输入程序块,每一组程序块直到输入0结束。

Output

对于每组测试,您的程序应输出输入中给出的数字的总和。
此问题包含多个测试用例!
多输入的第一行是整数N,然后是空行,后跟N个输入块。每个输入块都采用问题描述中指示的格式。输入块之间有一个空行。
输出格式由N个输出块组成。输出块之间有一个空行。
(PS:不允许存在前导零)

Simple Input

1
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0

Simple Output

370370367037037036703703703670

题意
这道题就是上一个题解中提到的多个数据相加,代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
char input[209];
int sum[209];
int main()
{
    
    
    int t;
    scanf("%d",&t);//实例个数
    while(t--)
    {
    
    
        memset(sum,0,sizeof(sum));//初始化总和为0
        while(true)
        {
    
    
            scanf("%s",input);//输入的一个大数
            if( strcmp(input,"0")==0 )
                break;
            int len=strlen(input);
            int i=len-1;
            for(int j=i; j>=0; j--)//输入的大数最高位在左边,直接把大数值叠加到总和上去即可
                sum[i-j]+=input[j]-'0';
        }
        int c=0;
        for(int i=0; i<200; i++)//总和进位
        {
    
    
            int s = c+sum[i];
            c = s/10;
            sum[i] = s%10;
        }
        int i;
        for(i=199; i>=0; i--) //找到总和的最高位,总和的高位在右
            if(sum[i]!=0)
                break;
        for(; i>0; i--)
            printf("%d",sum[i]);
        printf("%d",sum[0]);
        printf("\n");
        if(t>0)printf("\n");
    }
    return 0;
}

E题 亲和串(HDU 2203)

题目

皮皮又给大家带来签到题了!皮皮手上有若干个字符串s1,他现在想得到一种字符串s2, 这种字符串(s2)的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么s2就是皮皮需要的字符串。现在皮皮找到了若干可能的字符串s2,现在他拜托聪明的你帮他编写程序看看是不是皮皮需要的字符串,如果是则输入yes,不是则输出no。

Input

本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。

Output

如果s2是皮皮需要的字符串,则输出"yes",反之,输出"no"。每组测试的输出占一行
注意有多组输入!有规律,动手画画。next数组记得换个名字

Simple Input

AADDAD
ADA
ABABABAA
ADA

Simple Output

yes
no

题意
其实就是KMP应用,用到KMP模板。但是需要注意的地方是这个目标串只要通过循环移动能的得到模式串就可以。循环移动的意思是第一位移动到最后一位,然后一直移动循环。考试的时候一直没有想起来怎么把这个思想融入整体的代码里面,后来听题解的时候大佬给想了一种方法:让字符串乘两倍排列,如abc变成abcabc。然后在这个新的字符串中用kmp。

但是在博客上看到其他人的代码有很多都不是用的KMP,而是使用了一个find:

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    
    
    string s1, s2;
    int pos;
 
    while(cin >> s1) {
    
    
        cin >> s2;
 
        if(s1.size() < s2.size())
            cout << "no" << endl;
        else {
    
    
            s1 += s1;//注意这一步,string类是支持这种写法的
            pos = s1.find(s2);
            if(pos >= 0)
                cout << "yes" << endl;
            else
                cout << "no" << endl;
        }
    }
 
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_44899247/article/details/97636589