模串

思路分析

这道题其实就是一道纯模拟题,但我们需要仔细读清楚题意。

题目说的是什么呢?小歪有一个数字 ,初始为零。他依次读入 个字符串,对于第 个字符串,执行以下操作:

  • 如果第 个字符串的长度 满足 ,则 加一;
  • 否则, 减一。

最终要求整个过程中 能达到的最大值

那思路就很直接了:逐个读入字符串,每读一个就判断长度模 是否等于下标模 ,然后更新 ,同时维护一个最大值即可。

我们来手动模拟一下示例 1,字符串分别为 "d", "dd", "ddd", "ddddd", "d"

字符串 是否相等
1 d 1 1 1 1
2 dd 2 2 2 2
3 ddd 3 3 3 3
4 ddddd 5 1 0 2
5 d 1 1 1 3

的变化为 ,最大值为 ,符合预期。

这道题没有什么算法上的难度,核心就是理解题意 + 正确模拟。注意下标从 开始。

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    int l = 0, ans = 0;
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        int len = (int)s.size();
        if (len % m == i % m) {
            l++;
        } else {
            l--;
        }
        ans = max(ans, l);
    }

    cout << ans << "\n";
    return 0;
}
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int l = 0, ans = 0;
        for (int i = 1; i <= n; i++) {
            String s = br.readLine();
            int len = s.length();
            if (len % m == i % m) {
                l++;
            } else {
                l--;
            }
            ans = Math.max(ans, l);
        }

        System.out.println(ans);
    }
}

复杂度分析

  • 时间复杂度,其中 是所有字符串长度之和。读入每个字符串需要 ,判断和更新只要
  • 空间复杂度,只需要存储当前读入的一个字符串。