KMP笔记·

对于S串每一个特定的下标i,在满足s[i-j+1,i]=p[0,j]的前提下,我们需要找出j的最大值 唯一不同的在于,求next数组时,我们关心对于每个不同的下标i,j能走多远;匹配时,仍然是对于每个不同的i,j能走多远的问题,但我们只关心j是否走到末尾

j指向后一位方便了next的调用

匹配时,若j==n,那么此时i指向的是S中相匹配的最后一位,要得到初始位置需要有i-n+1

 

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=100005,M=1000005;
/*给定一个字符串 S,以及一个模式串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。
模式串 P 在字符串 S 中多次作为子串出现。
求出模式串 P 在字符串 S 中所有出现的位置的起始下标。
输入格式
第一行输入整数 N,表示字符串 P 的长度。
第二行输入字符串 P。
第三行输入整数 M,表示字符串 S 的长度。
第四行输入字符串 S。*/
//next数组,next[j]等于P[0]~P[j-1]这部分子串的前缀集合和后缀集合的最长交集长度,即最长公共前后缀 
int n,m;
char s[M],p[N];
int Next[N];
int main()
{ 
   cin>>n>>p>>m>>s;
   //构造Next 
   Next[0]=0;
   Next[1]=0;
   for(int i=1;i<n;i++)
   {
   	int j=Next[i];//针对P[0...i-1]的LPS table
   	while(j&&p[i]!=p[j]) j=Next[j];
   	if(p[i]==p[j]) Next[i+1]=j+1;//针对P[0...i]的LPS table,j就是一个公共长度
   	else           Next[i+1]=0;//前缀部分无法找到与新加入后缀匹配的位置,考虑到所求公共前缀里一定包括最后一位的“克隆”,也就是新加入的后缀,所以公共部分不存在
   }
   //KMP匹配
   //S[0...i]这一段中能否有P
   for(int i=0,j=0;i<m;i++)
   {
   	while(j&&s[i]!=p[j]) j=Next[j];
   	if(s[i]==p[j]) j++;
   	if(j==n)
   	{
   		printf("%d ",i-n+1);
	}
	} 
   return 0;	
}

### BCICIV_2A 数据集 下载、使用说明及相关文档 #### 关于BCICIV_2A数据集 BCI Competition IV 2a 是一项公开的脑机接口竞赛所使用的数据集,主要涉及运动想象任务的数据采集分析。该数据集提供了多通道 EEG(脑电图)信号记录,用于研究基于运动想象的脑机接口技术[^2]。 #### 数据集获取方式 可以通过以下两种格式下载 BCICIV_2A 数据集: 1. **GDF 文件版本**: GDF (General Data Format) 是一种通用的数据存储格式,适合保存高精度的时间序列数据。 2. **MAT 文件版本**: MATLAB 的 MAT 文件是一种更常见的科学计算数据交换格式,便于在 MATLAB 或 Python 中加载和处理。 具体下载链接可参考相关资料中的提供地址。 #### 数据集结构概述 BCICIV_2A 数据集中包含了多个实验参者的 EEG 记录文件,每份记录都附带详细的元信息描述。以下是其主要内容: - **实验范式 (Experimental Paradigm)**: 描述了参者执行的任务类型及其时间安排。 - **数据记录 (Data Recording)**: 提供了采样频率、传感器布局以及其他硬件参数的具体细节。 - **数据文件描述 (Data File Description)**: 阐明了 .gdf.mat 文件的内容构成及字段含义[^1]。 #### 数据读取方法 为了方便研究人员访问这些复杂的数据结构,可以利用专门设计的工具库来解析 GDF 格式的原始数据。例如,在 Python 生态系统中推荐使用 MNE-Python 库完成此操作: ```python import mne # 加载 gdf 文件到 Raw 对象 raw = mne.io.read_raw_gdf('path_to_your_file.gdf', preload=True) # 查看基本信息 print(raw.info) # 可视化部分 EEG 数据片段 picks_eeg = mne.pick_types(raw.info, eeg=True, exclude='bads') start_time, end_time = raw.time_as_index([10., 20.]) data, times = raw[picks_eeg, start_time:end_time] plt.figure(figsize=(10, 6)) plt.plot(times, data.T) plt.title("EEG Channels from Time Interval [10s to 20s]") plt.xlabel("Time (seconds)") plt.ylabel("Amplitude (\u03BCV)") plt.show() ``` 上述代码展示了如何通过 `mne` 工具包导入并初步探索 EEG 数据[^3]。 #### 进一步学习建议 对于希望深入挖掘 BCICIV_2A 数据集潜力的研究者来说,除了掌握基本的数据加载技巧外,还需要熟悉后续预处理步骤,比如滤波器应用、伪迹去除以及特征提取等高级主题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值