西安多校集训-字符串

news/2025/4/2 11:01:29/文章来源:https://www.cnblogs.com/Tighnari/p/18802912

前言

fun fact: 在 c层 听的,下午刚上课比较困,回神来发现讲的听不懂了,光速打开 OiWiki 看了二十分钟,在一听还没我看的快。

Hash 和 KMP

是不是之前写过,直接摆了。this

AC自动机

建立 Trie 树之后,关键是搭建失配指针,大致的还是上 OiWiki 或者别的大佬的博客吧,我写不出来。

板子1

#include<iostream>
#include<queue>
using namespace std;
const int N=1e6+50;
struct Tree{int fail;int vis[30];int end;
}tr[N];
int tot;
void insert(string s){int u=0;for(int i=0;i<(int)s.length();i++){if(tr[u].vis[s[i]-'a']==0){tr[u].vis[s[i]-'a']=++tot;}u=tr[u].vis[s[i]-'a'];}tr[u].end+=1;return ;
}
void build_fail(){queue<int> que;for(int i=0;i<26;i++){if(tr[0].vis[i]!=0){tr[tr[0].vis[i]].fail=0;que.push(tr[0].vis[i]);}}while(!que.empty()){int u=que.front();que.pop();for(int i=0;i<26;i++){if(tr[u].vis[i]!=0){tr[tr[u].vis[i]].fail=tr[tr[u].fail].vis[i];que.push(tr[u].vis[i]);}else{tr[u].vis[i]=tr[tr[u].fail].vis[i];}}}
}
int query(string s){int len=s.length()-1;int u=0,ans=0;for(int i=0;i<=len;i++){u=tr[u].vis[s[i]-'a'];for(int t=u;t&&tr[t].end!=-1;t=tr[t].fail){ans+=tr[t].end;tr[t].end=-1;}}return ans;
}
int main(){int n;cin>>n;for(int i=1;i<=n;i++){string s;cin>>s;insert(s);}tr[0].fail=0;build_fail();string s;cin>>s;cout<<query(s);return 0;
}

板子2

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e6+50;
struct Tree{int fail;int vis[30];int en;
}tr[N];
int tot;
int n;
struct Q{int num,pos;
}q[N];
bool cmp(Q a,Q b){if(a.num==b.num) return a.pos<b.pos;return a.num>b.num;
}
string s[N];
void init(int x){tr[x].fail=tr[x].en=0;memset(tr[x].vis,0,sizeof(tr[x].vis));return ;
}
void insert(string s,int num){int u=0;for(int i=0;i<(int)s.length();i++){if(tr[u].vis[s[i]-'a']==0){tr[u].vis[s[i]-'a']=++tot;init(tot);}u=tr[u].vis[s[i]-'a'];}tr[u].en=num;return ;
}
void build_fail(){queue<int> que;for(int i=0;i<26;i++){if(tr[0].vis[i]!=0){tr[tr[0].vis[i]].fail=0;que.push(tr[0].vis[i]);}}while(!que.empty()){int u=que.front();que.pop();for(int i=0;i<26;i++){if(tr[u].vis[i]!=0){tr[tr[u].vis[i]].fail=tr[tr[u].fail].vis[i];que.push(tr[u].vis[i]);}else{tr[u].vis[i]=tr[tr[u].fail].vis[i];}}}
}
int query(string s){int u=0,res=0;for(int i=0;i<(int)s.length();i++){u=tr[u].vis[s[i]-'a'];for(int t=u;t;t=tr[t].fail){q[tr[t].en].num++;}}return res;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);while(cin>>n){if(n==0) break;tot=0;init(0);for(int i=1;i<=n;i++){cin>>s[i];q[i].num=0;q[i].pos=i;insert(s[i],i);}tr[0].fail=0;build_fail();cin>>s[0];query(s[0]);sort(q+1,q+1+n,cmp);cout<<q[1].num<<'\n';cout<<s[q[1].pos]<<'\n';for(int i=2;i<=n;i++){if(q[i].num==q[i-1].num)cout<<s[q[i].pos]<<'\n';elsebreak;}}return 0;
}

manacher马拉车

为了防止讨论奇偶回文串的问题,在原序列每个字符中加入 '#' 然后就是只存在寄回文串了,而且也不影响原回文串,具体操作就是暴力扩展了。

#include<iostream>
#include<cstring>using namespace std;
const int N=2e7+2e6+50;
char s[N];
int cnt;
int pos[N];
int ans=0;
void read(){char c=getchar();s[0]='!';s[++cnt]='#';while(c<'a' || c>'z') c=getchar();while(c>='a' && c<='z'){s[++cnt]=c;s[++cnt]='#';c=getchar();}return ;
}
int main(){read();for(int i=1,r=0,mid=0;i<=cnt;i++){if(i<=r) pos[i]=min(pos[mid*2-i],r-i+1);while(s[i-pos[i]]==s[i+pos[i]]) ++pos[i];if(pos[i]+i>r) r=pos[i]+i-1,mid=i;if(pos[i]>ans) ans=pos[i];}cout<<ans-1;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908811.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源守护,智护童年——幼儿园未成年行为与安全智能监控系统

在孩子成长的每一步,安全始终是第一位的。幼儿园作为孩子们探索世界的起点,其安全管理的重要性不言而喻。然而,哭闹、打闹、意外跌倒,甚至外部隐患如陌生人逗留、内部管理疏漏等问题,常常让传统人工监控捉襟见肘。家长们也迫切希望了解孩子在园的点滴,渴望一份安心与信任…

20241220廖补林实验二《Python程序设计》实验报告

实验二 计算器设计 (一)实验内容 设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。 考核基本语法、判定语句、循环语句、逻辑运算等知识点 (二)实验要求 创建工程项目,使用Python语言实现具体的操作运算,并完成程序调试和运行,代码托管到码云。 我用…

网络基础

一、概念 冲突域设备发送数据会产生冲突的网络范围 集线器的所有接口在同一个冲突域 交换机的每个接口都是一个独立的冲突域寻址IP寻址是寻找目标在某一个范围 MAC寻址是具体寻找某一个设备MTU数据包的最大传输单元 接口收发数据支持的单个包的最大长度 以太网接口默认MTU1500B…

20241309 实验二《Python程序设计》实验报告

20241309 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2413 姓名: 梅良谦 学号:20241309 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。…

【操作系统】进程管理(二)

一、前言之前已经介绍了操作系统的各个模块,现在来具体深入学习操作系统中的进程管理。 二、进程的基本概念在未配置OS的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完成后,才允许另外一个程序执行;在多道程序环境下,则允许多个程序并发执行。也正是程序的并发…

MybatisPlus--持久层接口

IService: Save()boolean save(T entity) //批量插入 boolean saveBatch(Collection<T> entityList) boolean saveBatch(Collection<T> entityList, int vatchSIze)SQL:INSERT INTO user (name, email) VALUES (John Doe, john.doe@example.com)批量SQL:INSERT…

CH58x/CH59x动态修改广播包

前言:在日常使用中我们可能有需要动态修改广播包的情况。从机设备不走连接将一些传感器数据通过广播包显示出来 程序中提供了接口函数进行动态修改不用再先关闭广播再重新开启。/******************************************************************************** @fn …

docker 容器部署nginx+keepalived实现高可用

准备两台机器分别部署nginx和keepalived,事先部署好docker容器环境。主机名 ip地址 部署容器park2-0007 10.9.102.62 nginx+keepalivedpark2-0008 10.9.102.63 nginx+keepalived分别启动两个nginx容器docker run -d \--name my-nginx -p 8005:8005 \-v ./nginxdir/default.c…

GraphRAG介绍

一、RAG原理 用户输入了一个指令Instruct,RAG将其与Document store(向量库)中的预存文本进行匹配,然后将符合条件的筛选文本(Retrieved Documents)与指令Instruct,共同合成为一个增强型的Prompt,并将该增强型Prompt喂给大模型,最终大模型根据此增强型Prompt,生成最终的Re…

清理Docker数据卷volumes

原文链接地址 清理Docker数据卷volumes1.查看磁盘使用 2.查看Docker数据卷及磁盘使用情况 3.Docker 删除无用数据卷今天突然发现跑服务器的磁盘满了。记录下进入服务查看到Docker-Overlay2磁盘空间的清理方法:清理Docker的数据卷volumes Docker在长时间使用的情况下,经常需…

Web开发SpringBoot流程性的学习----回顾补充1

HTML(HyperText Markup Language)**:超文本标记语言 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。 标记语言:由标签构成的语言HTML标签都是预定义好的。例如:使用展示超链接,展示图片,展示视频。 HTML代码直接在浏览器中运…

【我的青春coding物语果然有问题!】第四次上机卡题复盘

最近事多 今天才写出来 实际做的时候变量名犯了很多很唐的错误 这里就不一一说了 我们看一下今天要讲的题目 05:正整数的任意进制转换 将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为[2,36],其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,...,Z…