A
#todo
B
//todo
C
"""
CUT
这道题采用dfs按切割长度搜出来每一种的切割方案
"""
n=input()
ls=[] #作为dfs里的迭代变量,因为会随着递归而改变
bc=[] #用来保存数据
def dfs(s):
if len(s)<1:
bc.append(ls.copy()) #在python里赋值会让两个变量指向同一个内存地址,所以如果采取赋值的操作,bc会因ls改变而改变
return
if len(s)==1:
ls.append(s)
bc.append(ls.copy()) #回溯最重要的一点,怎么来的怎么回去,在line22进行dfs(5)之前,此时的ls=['1','2'],在dfs(5),的时候会因为len(s)==1而改变为ls=['1','2','5'],所以要进行删除操作
ls.pop()
return
for i in range(1,len(s)+1):
ls.append(s[0:i])
dfs(s[i:len(s)])
ls.pop()
dfs(n)
ans=0
#最后将bc保存的值相加
for i in bc:
for j in i:
ans+=int(j)
print(ans)
D
/*
Diff
这题排列组合,可以通过规律找到排列组合的公式,也可以dfs
1.公式
第一个盒子有k种选取方式,因为不可以与上一个盒子内的东西相同,所以有k-1种,之后的盒子也是如此
所以有k*(k-1)*……*(k-1)中间为(n-1)个(k-1)
即k*(k-1)**(n-1)
2.dfs
搜索每一个物品的分支
例如
A
/ \
B C
/\ /\
C A A B
BCD以此类推
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, k, ans;
void dfs(int u, int cnt)
{
if (cnt == n) // 当数量==n时回溯
{
ans++;
return;
}
for (int i = 1; i <= k; i++)
{
if (i != u) // 只有下一件物品与上一件不同时才往下一层递归
dfs(i, cnt + 1);
}
}
int main()
{
cin >> n >> k;
// 搜索每一个物品的分支
for (int i = 1; i <= k; i++)
dfs(i, 1);
cout << ans << endl;
}
E
"""
EchoN
可以采取kmp,也可以采取双指针
"""
s = input()
res = len(s)
#因为要求前缀,那么aaba也就是从开始一直到结尾,从长度为1到len(s),都是aaba的前缀
# [1, 1]:a
# [1, 2]:aa
# [1, 3]:aab
# [1, 4]:aaba
#下面这个操作是为了求字符串中间是否存在有相同的前缀
#以niconiconi为例
#在i==4即s[4]=n之前while一直处于不成立状态,当i==4时,n==s[start],所以res+1,i也+1,这是为了继续匹配看后面还有多少相同的前缀,
# 当不再匹配的时候,for从此时的i继续进行循环,因为之前的情况都已排查好了,所以继续往后搜就可以了
for i in range(1, len(s)):
start = 0 #start表示前缀的末尾,初始为0
while i<=len(s)-1 and s[i] == s[start]:
res += 1
i += 1
start += 1
print(res)
F
//todo
G
//todo
H
//todo
I
a = list(map(int, input().split()))
s = sum(a)
if s > 0:
print("IMissYou!")
print(s)
else:
print("0v0")
J
//todo