
字符串
Aurora141592
这个作者很懒,什么都没留下…
展开
-
[字符串]z函数(扩展KMP)
z[i]是s和从i开始的s的后缀的最长公共前缀vector<int> z_function(string s) { int n = (int)s.length(); vector<int> z(n); for (int i = 1, l = 0, r = 0; i < n; ++i) { if (i <= r) z[i] = min(r - i + 1, z[i - l]); while (i + z[i] < n &&原创 2021-01-13 21:18:00 · 217 阅读 · 0 评论 -
[动态规划]编辑距离
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183#include<bits/stdc++.h>using namespace std;int dp[1005][1005];int main(){ memset(dp, 0x3f, sizeof(dp)); char a[1005], b[1005]; scanf("%s %s", a + 1, b + 1); int l原创 2021-01-03 14:42:47 · 94 阅读 · 1 评论 -
[字符串]后缀自动机
不是我写的//后缀自动机#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#define ll long longusing namespace std;const int N=2010000;char s[N];int fa[N],ch[N][26],len[N],siz[N];int lst=1,node=1,l,t[N],A[N];ll ans;原创 2020-12-31 09:55:43 · 203 阅读 · 1 评论 -
[图论+ 数据结构]AC自动机(TLE版本)
自闭了啊,搞了一天总算把算法实现了,然而这个算法是TLE的,我的trie写法太垃圾了。#include<bits/stdc++.h>using namespace std;typedef long long ll;#define maxn 1000005int pstl, pstr, idc;struct node{ node() : c(0), cnt(0), id(++idc) {sub.clear();} char c; vector<node*&原创 2020-12-31 09:53:58 · 315 阅读 · 1 评论 -
[算法]KMP
注意无法匹配的时候j是到j前一个字符的fail位置。#include<bits/stdc++.h>#define maxn 1000005using namespace std;char a[maxn], b[maxn];int fail[maxn];int main(){ scanf("%s %s", a, b); int la = strlen(a), lb = strlen(b); for (int j = 0, i = 1; i < lb; +原创 2020-12-31 09:53:15 · 77 阅读 · 0 评论 -
[字符串]manacher(回文串算法)
注意!:判断一个字符串是不是另一个的回文串,请你一定把整条字符串都判断一遍,不要只判断一半,可能另一半不匹配。#include<stdio.h>#include<algorithm>#include<string.h>#define maxn 110005using namespace std;int mp[2 * maxn];char a[2 * maxn], s[maxn];int main(){ while (~scanf("%s", s)原创 2020-12-30 13:04:08 · 84 阅读 · 0 评论 -
[算法]hash算法
栈hash(可删除):const int maxn = 5e6 + 5;char a[maxn], b[maxn], sta[maxn];unsigned int hsta[maxn], jian[maxn] = {1};int main(){ for (int i = 1; i < maxn; ++i) jian[i] = jian[i - 1] * 31; while (~scanf("%s %s", b, a)){ int la = strlen(a),原创 2020-12-29 13:58:55 · 78 阅读 · 0 评论 -
[数据结构]后缀数组 (SA)
#include <algorithm>#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int N = 1000010;char s[N];int n, sa[N], rk[N], oldrk[N << 1], id[N], px[N], cnt[N];// px[i] = rk[id[i]](用于排序的数组所以叫原创 2020-11-04 21:25:18 · 162 阅读 · 0 评论 -
【C++11】regex正则表达式
无聊写简单题的时候顺便学了一下这个强大的工具。常用函数:regex_match:全文匹配,要求整个字符串符合正则表达式的匹配规则。用来判断一个字符串和一个正则表达式是否模式匹配,如果匹配成功则返回true,否则返回false。regex_search:搜索匹配,根据正则表达式来搜索字符串中是否存在符合规则的子字符串。regex_replace:替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。要求输入一个正则表达式,以及一个用于替换匹配子字符串的格式化字符串。这个格式化字符串可以通过转义序列原创 2020-07-04 16:30:05 · 376 阅读 · 0 评论