1.4 百度求职攻略-理工科版本

1.4.1 校园招聘时间流程

网申

机考

面试

offer

7月-8月

8月-9月

9月-10月

10月-12月

1.4.2 薪资爆料

岗位

地点

学历

薪资范围(年薪)

计算机图形算法研发工程师

北京

硕士

薪资面议

嵌入式Linux软件研发工程师

北京

本科

薪资面议

基础平台研发工程师

北京

本科

薪资面议

Java研发工程师

北京

本科

薪资面议

Web前端研发工程师

北京

本科

薪资面议

安全工程师

北京

本科

薪资面议

*数据来源 牛客用户,更多详细信息可到牛客查询

1.4.3 面试真题

1、后缀变换

【题目描述】

牛牛定义一种字符串操作为: 对于任意字符串S,可以将其划分为两个非空子串x和y且满足S=xy,通过交换x和y子串的位置得到新字符串W且满足W=yx.例如对于字符串S="helloworld",将其划分为两个部分x="hello"和y="world",经过操作后得到新字符串W="worldhello"。

在给定初始字符串S和结束字符串T以及进行操作次数k,问有多少种不同的操作方案使得将S转化成T?因为答案很大,所以需要模上1000000007后输出。

两种操作方案被视为不同当且仅当存在第i次操作时刻(1≤i≤k),前者得到两部分子串为x1和y1,后者得到两部分子串为x2和y2时, x1≠x2成立。

输入描述:

第一行输入一个仅由小写字母构成的字符串S

第二行输入一个仅由小写字母构成的字符串T

第三行输入操作次数k

2≤|S|=|T|≤1000

1≤k≤100000

输出描述:

输出一个整数表示答案

输入样例:

aaca

caaa

2

输出样例:

2

说明:

"aaca" - "aaac" - "caaa"

"aaca" - "acaa" - "caaa"

【解题思路】

S串首尾相连转换成环的形式,那么对于每次操作的本质就是将下-轮起点转移到除当前的其他位置。考虑设dp[i[j]表示在第i次操作时处于环上第j个节点的方案,转移就是将dp[i-1][j]的值转移到除j以外的其他位置,直接修改复杂度是O(kn2),考虑到只有一个位置不被修改,将转移转化成全局修改以及单点修改两个部分,然后在O(nk)的复杂度内解决问题,进一步优化转移可以发现能将dp求解复杂度降为O(k)。对于最后答案的计算,将T串在S串上确定起点位置,然后将dp所得到对应起点的值求和即可。

【参考代码】

#include <bits/stdc++.h>

#define mp make_pair

#define pb push_back

#define pii pair<int, int>

#define link(x) for (edge *j = h[x]; j; j = j->next)

#define inc(i, l, r) for (int i = l; i <= r; i++)

#define dec(i, r, l) for (int i = r; i >= l; i--)

const int MAXN = 3e5 + 10;

const double eps = 1e-8;

const int mod = 1e9 + 7;

#define ll long long

using namespace std;

ll read() {

ll x = 0, f = 1;

char ch = getchar();

while (!isdigit(ch)) {

if (ch == '-')

f = -1;

ch = getchar();

}

while (isdigit(ch))

x = x * 10 + ch - '0', ch = getchar();

return x * f;

}

int n, k;

char s1[MAXN];

char s2[MAXN];

int dp2[2][MAXN];

int dp1[2];

int main() {

scanf("%s", s1 + 1);

n = strlen(s1 + 1);

scanf("%s", s2 + 1);

k = read();

int now = 0;

dp1[now] = 1;

inc(i, 2, n) dp2[now][i] = 1;

inc(i, 1, k) {

inc(j, 1, n) {

int x = (dp1[now] - dp2[now][j] + mod) % mod;

dp1[now ^ 1] += x;

dp1[now ^ 1] %= mod;

dp2[now ^ 1][j] += x;

dp2[now ^ 1][j] %= mod;

}

dp1[now] = 0;

inc(j, 1, n) dp2[now][j] = 0;

now ^= 1;

}

inc(i, n + 1, 2 * n) s1[i] = s1[i - n];

ll ans = 0;

inc(i, 1, n) {

bool flag = 0;

inc(j, 1, n) if (s1[i + j - 1] != s2[j]) {

flag = 1;

break;

}

if (!flag)

an

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024校招宝典——软件版本 文章被收录于专栏

牛客独家出品,理工科求职必备攻略,适合岗位: 软件开发、数据库分析、软件测试、前端后端开发

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务