gym 104252 L. Lazy Printing -> 贪心 + Kmp

文章讲述了如何利用KMP算法寻找以S[i]开头的最长子串,使其周期不超过D,从而在保证每段周期不超过D的前提下,最小化字符串S的分割段数。给出了一段C++代码示例来实现这一过程。

Problem - L - Codeforces

 题意  : 

给一个字符串 S 和整数 D , 要把 S 分割成若干段, 使得每段的周期 ≤ D , 求最少的分割段数

题解 : 

首先考虑贪心, 首先考虑以S[1]开头的最长的子串, 其周期 ≤ D, 然后把这一段取出来, pop_front掉, 然后重复这个过程, 现在的问题就是变成了怎么找到以S[i]开头的最长的子串使得其周期 ≤ D, 这里推荐使用 Kmp 算法, 不妨设 fail 指针为 link[] 数组, 然后我们知道 n-link[n] 就是长度为 n 的串的最小周期, 并且这个值会随着 n 的增大单调不减, 于是我们只需要考虑以 S[i] 开始跑 Kmp 算法, 直到某个位置的周期>D 就停下即可, 以下是带注释的C++代码

const int N = 4e5 + 20; // 两倍空间防止RE
int link[N];
int kmp(char *s, int lim) {
    for (int i = 1, j = 0;; i++) { // KMP
        while (j and s[i] != s[j])
            j = link[j - 1];
        j += (s[i] == s[j]);
        link[i] = j;
        if (i - j + 1 > lim) // 周期(i-j+1)不能大于lim
            return i;  // 返回周期小于等于lim的最大长度
    }
}
char s[N];
int main() {
    int n, d, ans = 0;
    std::cin >> s >> d;
    n = strlen(s);
    for (int i = 0; i < n;) {
        ans++;
        i += kmp(&s[i], d); // 贪心跳跃
    }
    std::cout << ans;
}

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fitness</groupId> <artifactId>gym-management</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.10</version> </dependency> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.10</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!-- MyBatis-Spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <!-- MySQL JDBC Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- 打包为war包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> </plugin> </plugins> </build> </project> 我这个报错找不到依赖项 'org.springframework:spring-context:5.3.10'找不到依赖项 'org.springframework:spring-webmvc:5.3.10'找不到依赖项 'org.mybatis:mybatis:3.5.7'找不到插件 'org.apache.maven.plugins:maven-war-plugin:3.3.1'
05-30
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值