[C++]字节9-20笔试题

1、字符串最短循环子串

输入一个字符串,判断其是否完全循环,若是循环的,则输出最短的循环子串,否则输出自身。

例1:
输入:abababab
输出:ab

备注:

  1. abababab以ab为最小串循环,故输出ab。
  2. abcabcab,这种不是完全循环,故输出自身abcabcab。

string s;
int len, Next[100000000];

void helper()     //寻找Next数组,KMP算法
{
	int i = 0, j = 0;
	Next[i] = j;
	for (i = 1; i < len; i++)
	{
		while (j && s[i] != s[j])
			j = Next[j - 1];
		if (s[i] == s[j])
			j++;
		Next[i] = j;
	}
}

int main()
{
	while (cin >> s)
	{
		len = s.size();
		helper();
		int L = len - Next[len - 1];   //求得最短循环子串的长度
		if (len%L)    //求余,判断是否完全循环,若不循环,则len不能被L整除
		{
			cout << s << endl;
		}
		else {    //若循环,则len能被L整除
			cout << s.substr(0, L) << endl;
		}
	}
	return 0;
}

2、简单计算器

张三需要找个工具人来帮忙计算数学题,这样的工具人太难找了,希望你编写一个简单的计算器,因为张三还是小学生,所以只需要非常少的功能。

  • 加法,1+2=3
  • 减法,1-2=-1
  • 乘法,1*2=2
  • 幂(就是求几次方),1^2=1

你需要编写一个支持这些运算的程序,并计算结果。

输入描述:
第一行第一个整数n,表示有n组输入
接下来的n行,每一行有整数a,b和字符op,表示操作数1,操作数2,运算类型,即a op b =?
约定所有输入的整数范围(-1e9<=num<=1e9),1e9表示10的9次方,所有的输入都合法。

示例1:
输入:
5
1 2 +
3 4 -
1000000000 1000000000 *
2 3 ^
2 1000000000 ^

输出:
3
-1
49
8
140625001

说明:
(a*b)%p=((a%p) *(b%p))%p


int MOD= 1000000007;

long long quickPow(long long num1, long long num2)  //快速幂
{
	if (num2 == 0)
		return 1;
	long long ret = quickPow(num1, num2 / 2) % MOD;
	ret = (ret*ret) % MOD;
	if (num2 % 2 == 1)
		ret = (ret*(num1%MOD)) % MOD;
	return ret;
}


int main()
{
	char op;
	int n;
	long long num1, num2, ret;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> num1 >> num2 >> op;
		switch (op)
		{
			case '+':ret = num1 + num2; break;
			case '-':ret = num1 - num2; break;
			case '*':ret = ((num1%MOD)*(num2%MOD)) % MOD; break;
			case '^':ret = quickPow(num1, num2); break;
			default:
				break;
		}
		cout << ret << endl;
	}
	return 0;
}

3、火车站选址

A市计划新建一个火车站方便市民出行。
这里道路十分规整,市民从位置(x1,y1)到位置(x2,y2)的路程为|x1-x2|+|y1-y2|。经过前期的考察,初步选取了M个可以修建火车站的位置,为了尽可能的节省市民到达火车站的时间,市长希望新建的火车站离每位市民的总路程尽可能小。
请帮市长选出最合适新建火车站的位置。

输入描述:
第一行有两个整数 N, M,分别表示市民的人数和可以建设火车站的位置。
后面N行,每行两个整数 x_i, y_i ,表示第 i 位市民的居住位置在( x_i, y_i )。
后面M行,每行两个整数 p_i, q_i,表示第 i 个火车站候选位置在 (p_i, q_i)。

1<=N<=100000
1<=M<=100000

-10000000<= x_i, y_i,p_i, q_i <= 10000000
其中50%的数据,-100<= x_i, y_i,p_i, q_i <= 100

输出描述:
两个整数p_i, q_i,表示最合适新建火车站的位置,若有多个答案,输出原始数据中第一个出现的。

示例1:
输入:
4 3
-1 -1
-1 1
1 -1
1 1
3 2
1 0
0 0

输出:
1 0


思路:
暴力办法,直接遍历火车站,计算最短距离的火车站,只能过40%。

4、完美树

某天你得到了一棵n个节点的无根树,无根树定义如下:

  • 离散数学中,无根树指无环联通无向图。
  • 一棵无根树是一个二元组<V,E>,其中:1.V是非空集合,称为顶点集。2.E是V中元素构成的无序二元组集合,称为边集。
  • 直观来说,若一个图中每条边都是无方向的,则称为无向图。无向图中的边均是顶点的无序对,无序对通常用圆括号表示。无根树它要求每个顶点之间都直接或间接相连,且图中没有环,即只有简单路径。
  • 由于树是图的子集,这一类图具有树的特征,但不具有树的形状,没有特定的根节点,故称为无根树。
  • 任意选取图中某个点为根,均可将无根树转化为有根树。

这棵树的每个节点都有正反面。现在你可以进行若干次操作,每次操作可以选择一个节点,把这个节点和它周围所有的节点都进行翻转。如果树的每个节点都是正面,那么这就是一棵完美树,现在请问你能否通过若干次操作把这颗树变成完美树。

输入描述:
所有读入均为整型树
第一行包含一个数T(1<=T<=5)表示样例数。
接下来T组样例,每组样例:
第一行包含一个整数n(1 <= n<= 500000),表示树的节点数。
接下来一行包含n个数 w_i ( 0<= w_i <= 1),表示树的每个节点是正面还是反面,0为反面,1为正面。
接下来 n-1,每一行包含2个数,u,v (1 <= u, v <= n),u-v表示一条树边。

输出描述:
输出T行,对于每组样例,如果能通过若干次操作把这颗树变成完美树,则输出YES,否则输出NO。

示例1:
输入:
2
3
0 0 0
1 2
1 3
2
0 1
1 2
输入:
YES
NO

说明:
第一个样例,对节点1进行操作,则所有节点都翻转为正面。
第二个样例,无论怎么操作都无法达成目标。

备注:
前30%的数据,小数据集(n <= 15)。
中间30%的数据,中等数据集(n <= 3000)。
后40%的数据,大数据集(n <= 500000)。


思路:
没有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值