getchar

【AC自动机】AC自动机

帅比萌擦擦* 提交于 2020-01-26 21:20:25
Definition & Solution AC自动机是一种多模式串的字符串匹配数据结构,核心在于利用 fail 指针在失配时将节点跳转到当前节点代表字符串的最长后缀子串。 首先对 模式串 建出一棵 tire 树,考虑树上以根节点为一个端点的每条链显然都对应着某一模式串的一个前缀子串,以下以树上的每个节点来代指从根节点到该节点对应的字符串。 定义一个字符串 \(S\) 在 trie 树上“出现过”当且仅当存在一条以根节点为一个端点的链,该链的对应字符串为 \(S\) 。 考虑对每个节点求出一个 fail 指针,该指针指向在树上出现的该子串的 最长 后缀子串的端点。考虑在匹配文本串的时候,如果某一位置失配,最优的选择显然是跳转到被匹配串的最长后缀子串。因为这样所有在树上出现过的字符串都有机会被跳转到。 需要注意的是如果一个字符串匹配到了文本串,那么他的所有后缀子串都能匹配文本串。也就是说对于一个节点,他的fail,fail的fail,一直到根节点都能匹配当前文本串。 考虑求出fail指针的方法: 设根节点为空,显然根节点的所有孩子的fail指着指向根节点。 对于一个已经求出 fail 指针的节点 \(u\) ,设 \(u\) 的 fail 指向 \(w\) ,考虑 \(u\) 的一个孩子 \(v\) ,设 \(w\) 对应的孩子为 \(z\) ,且设 \(z\) 在 trie

字符串算法学习笔记

痞子三分冷 提交于 2020-01-26 18:26:29
目录 字符串算法学习笔记 符号使用说民 kmp学习笔记 exkmp AC自动机总结 fail树 AC自动机上DP 杂题 后缀数据结构学习 字符串算法学习笔记 天坑,大概暑假就能填完了。 符号使用说民 一般用 \(S,T\) 表示一个字符串 字符串一般从1开始 用 \(S[l\ldots r]\) 表示一个子串 用 \(S\in T\) 表示 \(S\) 是 \(T\) 的子串 题目后的 \(\text{easy/normal/hard/lunatic}\) 表示题目的难度(大概对应NOIp d1t1+/NOIp d1d2+/弱省省选/强省省选) kmp学习笔记 exkmp 咕了( AC自动机总结 假设你们都懂AC自动机是啥了 fail树 \(\text{fail}\) 树就是连接所有 \(fail_u\) 和 \(u\) 的树。 考虑到 \(fail_u\) 所代表的串 \(\in u\) 所代表的串 所以若u所代表的串 \(\in S\) ,则在fail树上u到根的所有节点代表的串也 \(\in S\) 我们来看几个例题学习一下 P3966 [TJOI2013]单词 (normal) 题目链接 将fail树建出来。 然后将每一个串所走过的位置+1 然后每一个串的出现次数就是结束位置的fail树中的子树的权值之和。 代码如下 #include<bits/stdc++.h>

[kuangbin专题] Manacher

本小妞迷上赌 提交于 2020-01-26 06:09:36
https://vjudge.net/contest/284138#overview A、 Palindrome 最长回文子串,Manacher模板题 1 #include<iostream> 2 #include<sstream> 3 #include<fstream> 4 #include<algorithm> 5 #include<cstring> 6 #include<iomanip> 7 #include<cstdlib> 8 #include<cctype> 9 #include<vector> 10 #include<string> 11 #include<cmath> 12 #include<ctime> 13 #include<stack> 14 #include<queue> 15 #include<map> 16 #include<set> 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define random(a,b) (rand()%(b-a+1)+a) 19 #define ll long long 20 #define ull unsigned long long 21 #define e 2.71828182 22 #define Pi acos(-1.0) 23 #define ls(rt) (rt<

poj 2051 UVA 1203 LA 3135 Argus 题解

↘锁芯ラ 提交于 2020-01-26 03:57:05
博客观赏效果更佳 题意简述 有一些进程,每个进程有两个属性:id和per。id表示进程编号,per表示每per的时刻就会被调用一遍。如果有多个进程在同一时刻被调用,先调用进程编号小的。求先调用的k个进程。 思路框架 优先队列。定义小于号,每次取最小的,然后把它下一次被调用的时间放回优先队列。 具体思路 优先队列中,如果a<b,则b比a优先。我们的优先是时刻第一优先,id第二优先。我们保存当前进程被调用的时刻,per值,和id值。比较a<b的时候,由于小的优先,所以我们要先判断a的时间>b的时间,然后判断a的id>b的id。 对于一个进程(id,Time,per),它的下一次调用显然珂以被表示为(id,Time+per,per)。我们每次从优先队列中取最优先的(id,Time,per),将它弹出队列,然后把(id,Time+per,per)入队列,即珂 代码 # include <cstdio> # include <cstring> # include <cstdarg> # include <algorithm> # include <queue> using namespace std ; namespace Flandre_Scarlet { # define N 155555 # define F(i,l,r) for(int i=l;i<=r;++i) # define

输入字符(串) 时用 getchar() 吸收回车的情况

陌路散爱 提交于 2020-01-25 08:57:43
1.scanf()、getchar()后需要加 scanf()、getchar()不可以吸收后面的回车,故若后面继续有字符输入,中间必须加getchar()来吸收回车; 2. gets ()后不需要加 gets ()以回车作为输入结束,并且可以吸收后面的回车,故若后面继续有字符的输入,不用加getchar()吸收回车; 相关文章: 使用puts()和printf()输出字符串时的联系于区别 scanf()、gets()、getchar()在输入字符(串)时的区别总结 来源: CSDN 作者: CSRhao 链接: https://blog.csdn.net/Rhao999/article/details/104081214

CF5

孤街醉人 提交于 2020-01-25 02:24:05
A A \(map\) 应用 #include<bits/stdc++.h> using namespace std; namespace red{ #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define mid ((l+r)>>1) inline int read() { int x=0;char ch,f=1; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar()); if(ch=='-')f=0,ch=getchar(); while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } string s; int sum,ret; inline void main() { while(getline(cin,s)) { if(s[0]=='+') ++sum; else if(s[0]=='-') --sum; else { int t=s.find(':'); ret+=sum*(s.size()-1-t); } } cout<<ret; } } signed main() { red::main(); return 0; } B B 找到最长的一串,然后模拟就好了

文件与键盘输入与输出

穿精又带淫゛_ 提交于 2020-01-25 01:45:05
之前关于getchar的使用有个误区。getchar是一句输入结束后,挨个挨个读取的。 getchar用法 int getchar(void),从标准输入中一次读取一个字符。可以从键盘读入,也可以从文件读入。 从文件读入的方法: #include<stdio.h> FILE *fp; void main(){ char c; fp=freopen("test.txt","r",stdin); while((c=getchar())!=EOF){ putchar(c); } } 注意while((c=getchar())!=0),c=getchar()两边要再加括号。判断的是c的值,c从getchar读入后的值。一开始总以为c=getchar()会返回个1什么的。 gets()从标准输入中一次读入一句。可以键盘读入,可以文件读入。 从文件读入方法: #include<stdio.h> #include<string.h> FILE *fp; void main(){ char getstr[128]; char tmpstr[128]; char matchstr[128]; fp=freopen("test.txt","r",stdin); while(gets(getstr)){ if(strcmp(getstr,tmpstr)==0){ if(strcmp(getstr

The Preliminary Contest for ICPC Asia Nanjing 2019

只谈情不闲聊 提交于 2020-01-24 18:19:28
A.The beautiful values of the palace 首先对于每个 \((x,y)\) ,我们可以 \(O(1)\) 的查询出这个坐标的值。接下来就将问题转化为了一个 \(10^6 \cdot 10^6\) 的矩阵,每次查询子矩阵内的点的和。 考虑将所有的 \(y\) 离散化,计 \(mp_{i,j}\) 表示 \((1,1)-(i,j)\) 的和,那么对于 \((x_1,y_1)->(x_2,y_2)\) ,答案即为 \(mp_{x_2,y_2}-mp_{x_1-1,y_2}-mp_{x_2,y1-1}+mp_{x_1-1,y_1-1}\) 考虑离线做法: 把所有的点按照 \(x\) 从小到达排序,每加入一个点,利用树状数组插入,每次查询,利用树状数组查询四个前缀和即可。时间复杂度 \((m+4p) \cdot log(m+4p)\) 。 #include<bits/stdc++.h> using namespace std; const int N = 1e6+100; const int mod = 1e9+7; typedef long long ll; const int INF = 0x3f3f3f3f; const ll llINF = 0x3f3f3f3f3f3f3f3f; #define rep(i,a,b) for(int i=(a);i<=

CF4

坚强是说给别人听的谎言 提交于 2020-01-24 17:14:42
A A 奇数或者 \(2\) 是 \(NO\) #include<bits/stdc++.h> using namespace std; namespace red{ inline int read() { int x=0;char ch,f=1; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar()); if(ch=='-')f=0,ch=getchar(); while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } int n; inline void main() { n=read(); if(n&1||n==2) puts("NO"); else puts("YES"); } } signed main() { red::main(); return 0; } B B 先都给最少的,然后从前往后加就行了 #include<bits/stdc++.h> using namespace std; namespace red{ inline int read() { int x=0;char ch,f=1; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());

NOIP模拟赛20161022

荒凉一梦 提交于 2020-01-24 17:00:46
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas classroom.cpp/c/pas 输入文件 robot.in spring.in iceroad.in classroom.in 输出文件 robot.out spring.out iceroad.out classroom.out 时间限制 1000MS 1000MS 1000MS 1000MS 内存限制 64MB 128MB 128MB 128MB 测试点 20 20 10 10 测试点分值 5 5 10 10 Problem 1 东风谷早苗 (robot.cpp/c/pas) 题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女。某一天,早苗终于入手了最新款的钢达姆模型。作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重)。早苗的新模型可以按照输入的命令进行移动,命令包含’E’、’S’、’W’、’N’四种,分别对应四个不同的方向,依次为东、南、西、北。执行某个命令时,它会向着对应方向移动一个单位。作为新型机器人,自然不会只单单执行一个命令,它可以执行命令串。对于输入的命令串,每一秒它会按照命令行动一次。而执行完命令串最后一个命令后