今天是暑期训练 第七 第六天(中间放了一天假)。

学习字符串简单算法,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相关推荐

  1. Java基础day6

    Java基础day6 Java基础day6 debug和基础练习 1 debug模式 1.1 什么是debug模式 1.2 debug模式操作 2 基础练习 2.2.1 减肥计划if版本 2.2.2 ...

  2. 创建Student Course SC表

    student 表 create table student ( sno char(9)     primary key, sname char(20)    not null, Ssex char( ...

  3. sc修改服务器,华为sc服务器配置方法

    华为sc服务器配置方法 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 云耀云服 ...

  4. 戴尔sc系列存储阵列柜服务器,国产化的戴尔存储 到底都长什么样?

    今年3月末,戴尔宣布自己的Storage SC4020存储正式开始实行国产化.虽然日前有传出戴尔PC将预装国产麒麟操作系统,适应中国市场等消息,但在企业级产品的国产化并没有太大动静,直至这次戴尔标杆式 ...

  5. SVN配置自启动服务碰到[SC] OpenSCManager 失败 5:解决办法

    [SC] OpenSCManager 失败 5: 1.首先进入regedit 2.按红框的路径找到EnableLUA 3.双击EnableLUA:将数据类型改为 0 即可 4.记得重启电脑 PS:这个 ...

  6. sc config 命令(详细)

    我就不介绍SC是做什么的了,我想即然你找到这来了说明你就有一定认识了. sc config 描述:         在注册表和服务数据库中修改服务项. 用法:         sc <serve ...

  7. 十一Python之路,Day6 - 面向对象学习

    本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你 ...

  8. 使用SC命令时注意事项

    使用SC命令时注意事项[转] Windows 2003 Server存在一个sc命令,(好像Windows 2000/XP/NT都有这个.)该命令可以手工创建Windows服务(NT Service) ...

  9. Discuz在线升级中的SC和TC分别是什么意思?

    检测到有新的版本可供升级,您可以选择自动升级或者下载安装包手动升级.   Discuz! X2.5_SC_UTF8版本 Discuz! X2.5_TC_UTF8版本 ----------------- ...

最新文章

  1. 一文详尽2019全年AI技术突破
  2. mysql left join 慢 的一个原因
  3. EMOS 1.5安装和配置
  4. eclipse egit提交方法
  5. android studio导出apk步骤
  6. Shell中的常用操作
  7. buuoj-crypto 2
  8. crontab -e 运行python的脚本的坑
  9. 深入Nginx之《常用参数配置技巧》
  10. 《C++ Primer》14.4节练习(部分)
  11. scoket多线程例子
  12. Adobe illustrator 介绍几个快捷键 - 连载 8
  13. Largest Number 179
  14. 面向对象思想的设计原则概述
  15. 乌鲁木齐市建筑物矢量数据(Shp格式+带高度)
  16. Unity之使用Shader实现背景循环播放
  17. ESP32-WROOM-32E,WIFI基本功能实现,采坑经验
  18. 定位技术--蜂窝基站
  19. Boost 之 lexical_cast
  20. 考研计算机300分什么水平,工科类考研300分什么概念?算不算高?

热门文章

  1. 【转摘】PYTHON 正则表达式
  2. 小米3 开发人员选项
  3. SSL只是基本安全措施
  4. 开源应用架构之​Selenium WebDriver讲解
  5. matlab画三维图
  6. linux命令dd创建虚拟硬盘,每日一题.PYTHON如何模拟LINUX的dd命令快速创建大文件?...
  7. 四位先行进位电路逻辑表达式_四位超前进位加法器
  8. python交互界面的退出
  9. python 读取音频文件(mp3,wav)时间的两种方法
  10. 牛客华为机试第1题python