Gym - 101164C - Castle KMP
2024-10-21 19:52:09
题目链接:传送门
题解:
利用KMP的fail失配数组,快速找到当前后缀与前缀的公共前缀点
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
typedef unsigned long long ULL;
const long long INF = 1e18+1LL;
const double pi = acos(-1.0);
const int N = 2e6+, M = 1e3+,inf = 2e9; int fail[N],vis[N],n,Q,cnt,op[N],QQ[N];
char a[N],b[N],ch[N][];
int sum[N];
void build_fail() {
memset(fail,-,sizeof(fail));
int j = -;
for(int i = ; i < cnt; ++i) {
while(j!=-&&b[j+]!=b[i]) j = fail[j];
if(b[j+] == b[i]) j++;
fail[i] = j;
}
}
int len[N];
int main() {
scanf("%d%d",&n,&Q);
scanf("%s",a);
for(int i = ; i < n; ++i) b[i] = a[i];
cnt = n;
len[] = n;
for(int i = ; i <= Q; ++i) {
scanf("%d",&op[i]);
len[i] = len[i-];
if(op[i] == ) {
scanf("%s",ch[i]);
b[cnt++] = ch[i][];
len[i]+=;
}
else if(op[i] == ) QQ[cnt-] = ;
}
build_fail();
for(int i = ; i < cnt; ++i) {
sum[i] = QQ[i];
if(fail[i]!=-) {
sum[i] += sum[fail[i]];
}
}
int ccnt = n;
for(int i = ; i <= Q; ++i) {
if(op[i] == ) {
ccnt++;
}
else if(op[i] == ) {
vis[ccnt-] = ;
}
else if(op[i] == ) {
int ret = ;
if(vis[ccnt-]) ret = sum[ccnt-];
else ret = sum[ccnt-] - QQ[ccnt-];
printf("%d\n",ret);
}
}
return ;
}
最新文章
- sublime text 插件
- Python学习第一天 -- 简单的属性、 语法学习
- java中运算符的解析和计算
- slot signal机制
- 《linux 内核全然剖析》 chapter 2 微型计算机组成结构
- 使用开源库MagicalRecord操作CoreData
- Luence简单实现1
- Unity3d Shader开发(三)Pass(Color, Material, Lighting )
- JSTL详解
- 算法模板——平衡树Treap
- [转] vue自定义组件(通过Vue.use()来使用)即install的使用
- mysql 数据库主从同步
- v-for key
- ElasticSearch 2 (13) - 深入搜索系列之结构化搜索
- Xcode打包踩过的那些坑
- Eclipse中Ant的配置与测试
- eclipse下载与安装并测试
- lombok java代码助手
- Apache mahout 源码阅读笔记-DataModel之UserBaseRecommender
- D3.js 使用心得