ASFNU SC Day6
今天是暑期训练 第七 第六天(中间放了一天假)。
学习字符串简单算法,kmp,AC自动机,trie树等。
----算法模板----
KMP:随手打的,不知道能不能过。
void getnxt(char *W){memset(nxt,-1,sizeof nxt);int k=-1,wlen=strlen(W);for(int q=0;q<wlen;q++){while(k!=-1){if(W[q]==W[k]) break;k=nxt[k];}nxt[q+1]=++k;} } int KMP(char *W,char *T){int ans=0;int wlen=strlen(W),tlen=strlen(T);for(int i=0,j=0;i<=tlen;i++,j++){if(j==-1) continue;if(W[j]!=T[i]||j==wlen){ans+=(j==wlen?1:0);i--; j=nxt[j]-1;continue;}}return ans; }
AC自动机,trie树:
//trie树 void add(char *s,int num){int len=strlen(s),x=0;val[0]='\n';for(int pos=0;pos<len;pos++){if(!trie[x][s[pos]-'a']){trie[x][s[pos]-'a']=++cnt;val[cnt]=s[pos];}x=trie[x][s[pos]-'a'];}end[x]=num;return ; } //AC自动机 queue <int> q; void bfs(){q.push(0);while(!q.empty()){int now=q.front();q.pop();for(int i=0;i<=25;i++){if(!trie[now][i]) continue;if(now==0){q.push(trie[now][i]);continue;}int j=fail[now];while(!trie[j][i]&&j)j=fail[j];fail[trie[now][i]]=trie[j][i];q.push(trie[now][i]);}}return ; } void search(char *s){int x=0;int len=strlen(s);for(int pos=0;pos<=len;pos++){int j=x;while(j){if(j==fail[j]) exit(-1);if(end[j]) ans[end[j]]++;j=fail[j];}while(!trie[x][s[pos]-'a']&&x) x=fail[x];x=trie[x][s[pos]-'a'];}return ; }
-----模拟赛&例题-----
地址:https://cn.vjudge.net/contest/236074
A.POJ 3461
kmp裸题。
B.POJ 2752
有两种想法,但做法一样。
一、看作自己与自己匹配,每次成功匹配的位置即是答案。
(不必真的跑KMP,只需要递归加入答案即可)
二、既然是找相同前缀后缀,那么最长的已经算出,第二长的就是最长的最长相同前缀后缀,以此类推。
(和上一种实现方法相同)
其实我认为,这两种想法的等价性就是KMP的精华所在。
C.POJ 3080
枚举第一个串的字串,然后看看它们是不是其它串的字串。
原来复杂度是O(len^4*n)的,kmp优化后为O(len^3*n+n^2)
D.POJ 2406
我们发现,如果循环节存在,那么这个串的最长相同前缀后缀必然和原串只差一个循环节长。
所以跑nxt后判断输出答案即可。
E.HYSBZ 1030
AC自动机上DP……
开始写了一个dfs,获得10分。
后来考虑优化,发现可以用dp[i][j]表示考虑i位,当前在j的方案数。
接着我们又会发现如果存含可读单词的方案数在AC自动机上不好跑……
所以存不含可读单词的,AC自动机上转移即可。
最后用26^M-Σdp[M][i]即可。
F.HDU 2222
AC自动机裸题。去年居然RE了……
教训:strlen不仅不能在循环里用,也不能在递归函数里用,要传参下去。
T了数百次啊……
附代码:
以后有时间再放吧。
转载于:https://www.cnblogs.com/JiuPleber/p/9251698.html
ASFNU SC Day6相关推荐
- Java基础day6
Java基础day6 Java基础day6 debug和基础练习 1 debug模式 1.1 什么是debug模式 1.2 debug模式操作 2 基础练习 2.2.1 减肥计划if版本 2.2.2 ...
- 创建Student Course SC表
student 表 create table student ( sno char(9) primary key, sname char(20) not null, Ssex char( ...
- sc修改服务器,华为sc服务器配置方法
华为sc服务器配置方法 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 云耀云服 ...
- 戴尔sc系列存储阵列柜服务器,国产化的戴尔存储 到底都长什么样?
今年3月末,戴尔宣布自己的Storage SC4020存储正式开始实行国产化.虽然日前有传出戴尔PC将预装国产麒麟操作系统,适应中国市场等消息,但在企业级产品的国产化并没有太大动静,直至这次戴尔标杆式 ...
- SVN配置自启动服务碰到[SC] OpenSCManager 失败 5:解决办法
[SC] OpenSCManager 失败 5: 1.首先进入regedit 2.按红框的路径找到EnableLUA 3.双击EnableLUA:将数据类型改为 0 即可 4.记得重启电脑 PS:这个 ...
- sc config 命令(详细)
我就不介绍SC是做什么的了,我想即然你找到这来了说明你就有一定认识了. sc config 描述: 在注册表和服务数据库中修改服务项. 用法: sc <serve ...
- 十一Python之路,Day6 - 面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你 ...
- 使用SC命令时注意事项
使用SC命令时注意事项[转] Windows 2003 Server存在一个sc命令,(好像Windows 2000/XP/NT都有这个.)该命令可以手工创建Windows服务(NT Service) ...
- Discuz在线升级中的SC和TC分别是什么意思?
检测到有新的版本可供升级,您可以选择自动升级或者下载安装包手动升级. Discuz! X2.5_SC_UTF8版本 Discuz! X2.5_TC_UTF8版本 ----------------- ...
最新文章
- 一文详尽2019全年AI技术突破
- mysql left join 慢 的一个原因
- EMOS 1.5安装和配置
- eclipse egit提交方法
- android studio导出apk步骤
- Shell中的常用操作
- buuoj-crypto 2
- crontab -e 运行python的脚本的坑
- 深入Nginx之《常用参数配置技巧》
- 《C++ Primer》14.4节练习(部分)
- scoket多线程例子
- Adobe illustrator 介绍几个快捷键 - 连载 8
- Largest Number 179
- 面向对象思想的设计原则概述
- 乌鲁木齐市建筑物矢量数据(Shp格式+带高度)
- Unity之使用Shader实现背景循环播放
- ESP32-WROOM-32E,WIFI基本功能实现,采坑经验
- 定位技术--蜂窝基站
- Boost 之 lexical_cast
- 考研计算机300分什么水平,工科类考研300分什么概念?算不算高?