深信服笔试09.01

算法A卷
一共3个编程题
1. 日志分析
输入:正整数 T,紧接着是 T 行字符串
输出:T 行,每个日志的潜在攻击数,结果对 1e9+7 取模。
求攻击次数,攻击次数就是字符串中包含 “swr”。
比如   输入 “swr” ,输出 1  ;输入“rws” ,输出 0
思路:
统计每个w字符 的前缀 r字符个数 和后缀 s 个数
#include<bits/stdc++.h>
using namespace std;

int main()
{
      const int mod = 1e9+7;
    int T;cin>>T;
    while(T--){
      string s;cin>>s;
      int n = s.size();
      long ans = 0;
      vector<int>pre(n+1),next(n+1);
      for(int i=0;i<n;++i){
        if(s[i]=='s')pre[i+1]=pre[i]+1;
        else pre[i+1]=pre[i];
      }
      for(int i=n-1;i>=0;--i){
        if(s[i]=='r')next[i]=next[i+1]+1; else next[i]=next[i+1];
      }
      for(int i=0;i<n;++i){
          if(s[i]=='w')ans+=((long)pre[i]*next[i])%mod;
      }
      cout<<ans<<'\n';
    }
    return 0;
}
2. 旅游人数
输入n。表示一共n个员工旅行,每个员工都有特定时间段。
之后是 n 行,每行两个正整数a, b,表示一位员工方便旅游的时间段为 [a, b]。
问最多可以同时让多少位员工觉得方便,就是输出某个时间方便人数最多的数量。

思路:
用数组表示每个时间段人数,对输入的每个区间[a,b]进行累加1,然后遍历人数,找到最大即为答案。
因为每次都会进行区间累加,如果一次次遍历效率很低。
构建差分数组,数组num[i]代表对前一个nums[i-1]的人数差。
例如 数组 x = [1,3,6,2,4]  差分数组则是 nums = [1,2,3,-4,2]
那么对区间[0,2]都+1的话,只要对数组nums操作即可:nums[0]+=1; nums[2+1]-=1;  即 nums = [2,2,3,-5,2]
之后对数组 nums 进行还原就得到了更新后的人数,即 nums[i] = nums[i]+nums[i-1];  (为了判断下标越界,多开一个空间即可)。
#include<bits/stdc++.h>
using namespace std;

int main()
{
    vector<int>nums(1e6+5);
    int n;cin>>n;
    int a,b;
    for(int i=0;i<n;++i)
    {
        cin>>a>>b;
        nums[a]+=1;
        nums[b+1]-=1;
    }
    int ans = 0;
    for(int i=1;i<nums.size();++i)
    {
        nums[i]+=nums[i-1];
        ans = max(ans,nums[i]);
    }
    cout<<ans<<'\n';
    return 0;
}
3.    五进制模拟
非常简单,模拟即可。

欢迎各位交流。
#深信服笔试题#
全部评论
您好,请问第二题可以详细说明一下吗
点赞 回复 分享
发布于 2022-09-02 09:39 广东
请问第三题为什么通过了测试用例,但提交的时候通过0%呢,大佬你碰到过这种情况吗
点赞 回复 分享
发布于 2022-09-05 21:31 北京
第二题没太看懂,大佬能再具体讲一下吗
1 回复 分享
发布于 2022-09-01 23:02 广东
第一题dp T = int(input()) def solve(x,y):     m,n = len(x), len(y)     dp = [[0]*(n+1) for _ in range(m+1)]     for i in range(m+1):         dp[i][0]=1          for i in range(1,m+1):         for j in range(1,n+1):             if x[i-1] == y[j-1]:                 dp[i][j] = dp[i-1][j-1]+dp[i-1][j]             else:                 dp[i][j] = dp[i-1][j]     return dp[m][n]%int(1e9+7) for _ in range(T):     s=input().strip()     print(solve(s,"swr"))
点赞 回复 分享
发布于 2022-09-08 17:05 广东

相关推荐

爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
11 21 评论
分享
牛客网
牛客企业服务