1、字符串最短循环子串
输入一个字符串,判断其是否完全循环,若是循环的,则输出最短的循环子串,否则输出自身。
例1:
输入:abababab
输出:ab
备注:
- abababab以ab为最小串循环,故输出ab。
- 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)。
思路:
没有