【刷题】综合模拟2——2019浙大上机模拟(晴神)

这篇博客主要涵盖了四种算法问题:KMP算法中的next数组概念及其求解,链表的头尾交错重排,无向图的极大匹配判断,以及有向无环图的关键路径计算。对于每个问题,博客提供了问题描述、输入输出示例和解题分析。
摘要由CSDN通过智能技术生成

A - next[i]

Problem Description

在字符串匹配的KMP算法中有一个重要的概念是next数组,求解它的过程让不少同学伤透了心。next数组的直接语义其实是:使“长度为L的前缀”与“长度为L的后缀”相同的最大L,且满足条件的前后缀不能是原字符串本身。

例如对字符串"ababa"来说,长度为1的前缀与后缀都是"a",它们相同;长度为2的前缀与后缀分别是"ab"和"ba",它们不相同;长度为3的前缀与后缀都是"aba",它们相同;长度为4的前缀与后缀分别是"abab"和"baba",它们不相同。因此对字符串"ababa"来说,使“长度为L的前缀”与“长度为L的后缀”相同的最大L是3。

现在我们把这个最大的L值称为原字符串S的next值。在此概念的基础上,对给定的字符串S,下标为从1到N,那么next[i]就是指子串S[1…i]的next值。

现在给定一个字符串,下标从1到N,然后给一个下标i,求next[i]。

Input

每个输入文件一组数据。

只有一行,输入一个仅由小写字母组成的长度为N(1<=N<=100)的字符串、与一个下标i(1<=i<=N)。

Output

一个整数,即next[i]。

Sample Input 1

ababa 5

Sample Output 1

3

Sample Input 2

ababab 4

Sample Output 2

2

Sample Input 3

ab 2

Sample Output 3

0

分析:掌握具体算法即可,算法详解见KMP算法

#include<bits/stdc++.h>
using namespace std;
void buildNext(string str, int nt[]){
    int len = str.size();
    nt[0] = -1;
    int t = nt[0], j = 0;
    while(j < len - 1){
        if(t < 0 || str[j] == str[t]){
            nt[++j] = ++t;
        }else{
            t = nt[t];
        }
    }
}
int main(){
    int nt[110];
    string str;
    cin>>str;
    buildNext(str, nt);
    int index;
    cin>>index;
    cout<<nt[index - 1] + 1<<endl;
    return 0;
}

B - 链表重排

Problem Description

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值