预备役间学习记录13

一、学习算法

1、最短路径(Floyd:逐个顶点试探法(求每对顶点间的最短距离))

(1、)初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为无穷;

(2、)逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值;

(3、)所有顶点试探完毕,算法结束。

附代码

for(int k=0;k<n;k++)//逐个试探每个顶点为中间节点
  for(int i=0;i<n;i++)//找能将这个点加入的关系
   for(int j=0;j<n;j++)
    if(i!=k&&j!=k&&jl[i][k]+jl[k][j]<jl[i][j])//加入后更小就更新距离和路线
    {jl[i][j]=jl[i][k]+jl[k][j];
     lx[i][j]=joinList(lx[i][k],lx[k][j]);
    }    

2、优先队列

(1、)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

(2、)在优先队列中,元素被赋予优先级,当访问元素时,具有最高优先级的元素最先出,通常采用堆数据结构来实现。

3、堆

(1、) 堆是一种经过排序的树形数据结构,每个节点都有一个值。通常我们所说的堆的数据结构是指完全二叉树。堆的特点是根节点的值最小(或最大),且根节点的两个树也是一个堆。

(2、) 堆的存储不同于链表的存储,堆的存储是用一个一维数组来存储的。

(3、)操作:up,down,insert,delete,change

二、刷题题解

1、# [BOI2009]Radio Transmission 无线传输

## 题目描述

给你一个字符串 $s_1$,它是由某个字符串 $s_2$ 不断自我连接形成的。但是字符串 $s_2$ 是不确定的,现在只想知道它的最短长度是多少。

## 输入格式

第一行一个整数 $L$,表示给出字符串的长度。

第二行给出字符串 $s_1$ 的一个子串,全由小写字母组成。

## 输出格式

仅一行,表示 $s_2$ 的最短长度。

## 样例 #1

### 样例输入 #1

```

8

cabcabca

```

### 样例输出 #1

```

3

```

## 提示

#### 样例输入输出 1 解释

对于样例,我们可以利用 $\texttt{abc}$ 不断自我连接得到 $\texttt{abcabcabc}$,读入的 $\texttt{cabcabca}$,是它的子串。

#### 规模与约定

对于全部的测试点,保证 $1 < L \le 10^6$。

1、由题我们已知,一个由某一个子串不断自我连接而成的串,要我们求出,这个子串长度;

2、举一个例子串是abc,自我连接后成abcabcabcabc;我们发现对它求最大公共前后缀是

后缀:abcabcabcabc

前缀:abcabcabcabc

3、所以我们就知n-整串得最大公共前后缀即可得子串长度

附代码

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

int net[1001000];

main()
{ char z[1001000];
  int n,j=0;
  scanf("%d\n%s",&n,z+1);
   for(int i=2;i<=n;i++)
    {  while(j&&z[j+1]!=z[i]) j=net[j];
       if(z[j+1]==z[i]) j++;
       net[i]=j;    
    }    
 cout<<n-net[n]<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值