2017.3.15 审查(黄金) 思考记录
这个题由于满足递归的性质,所以可以用 ac自动机 + 栈 处理
然并卵,莫名T了一个点、
#include<iostream>
#include<cstdio>
using namespace std;
#include<cstring>
struct ac {
ac *fail;
ac * xia[26];
int ci,ceng;
ac() {
fail = NULL;
ci= 0;
memset(xia, NULL, sizeof (xia));
}
} *q[10000001],*root;
int hehe,changdu[500001],i,huhu;
char s1[500001];
int zhen1,zhen2;
void insert(char *str, ac *root) {
ac *p = root;
int i = 0, zimu;
while (str[i]) {
zimu = str[i] - 'a';
if (p->xia[zimu] == NULL)
{
p->xia[zimu] = new ac();
}
p = p->xia[zimu];
i++;
}
p->ci=++hehe;
}
void shipei(ac *root) {
int i;
root->fail = NULL;
q[zhen1++] = root;
while (zhen1 != zhen2) {
ac *now = q[zhen2++];
ac *p = NULL;
for (i = 0; i < 26; i++) {
if (now->xia[i] != NULL) {
if (now == root)
now->xia[i]->fail = root;
else {
p = now->fail;
while (p != NULL) {
if (p->xia[i] != NULL) {
now->xia[i]->fail = p->xia[i];
break;
}
p = p->fail;
}
if (p == NULL)
now->xia[i]->fail = root;
}
q[zhen1++] = now->xia[i];
}
}
}
}
int zhan[500005],zhen;
char ystr[500005];
int zimu;
ac *tui(ac *now)
{
zimu = ystr[i] - 'a';
while (now->xia[zimu] == NULL && now != root) now = now->fail;
now = now->xia[zimu];
if(now==NULL)now=root;
return now;
}
ac *f[500008];
void work()
{ //cout<<"ppp";
// ac *shang=root;
zhan[0]=500005;
int *zhen=zhan;
f[500005]=root;int fin=strlen(ystr);
for(i=0;i<fin;i++)
{
++zhen;
*zhen=i;
f[i]=tui(f[*(zhen-1)]);
if(f[i]->ci)zhen-=changdu[f[i]->ci];
}
for(int *i=zhan+1;i!=zhen;i++)
{
printf("%c",ystr[*i]);
}
printf("%c",ystr[*zhen]);
}
int main() {
int n, t;
scanf("%s", ystr);
zhen1 = zhen2 = 0;
root = new ac();
scanf("%d", &n);
for(i=1;i<=n;i++){
scanf("%s",s1);
insert(s1, root);
changdu[i]=strlen(s1);
}
// cout<<strlen(ystr)<<" ";
shipei(root);
//cout<<"pp";
work();
return 0;
}
当天下午,终于过了,,,
托做多了lych的题的福,总算应用记搜了、(记搜还真是强大,虽然比正解慢)
#include<iostream>
#include<cstdio>
using namespace std;
#include<cstring>struct ac {ac *fail; ac * xia[26];int ci,ceng; ac() { fail = NULL;ci= 0;memset(xia, NULL, sizeof (xia));}
} *q[500001],*root;
int hehe,changdu[100001],i,huhu;
char s1[100001];
int zhen1,zhen2; void insert(char *str, ac *root) {ac *p = root;int i = 0, zimu;while (str[i]) {zimu = str[i] - 'a';if (p->xia[zimu] == NULL){p->xia[zimu] = new ac();}p = p->xia[zimu];i++;}p->ci=++hehe;
}void shipei(ac *root) {int i;root->fail = NULL;q[zhen1++] = root;while (zhen1 != zhen2) {ac *now = q[zhen2++];ac *p = NULL;for (i = 0; i < 26; i++) {if (now->xia[i] != NULL) {if (now == root)now->xia[i]->fail = root;else {p = now->fail;while (p != NULL) {if (p->xia[i] != NULL) {now->xia[i]->fail = p->xia[i];break;}p = p->fail;}if (p == NULL)now->xia[i]->fail = root;}q[zhen1++] = now->xia[i];}}}
}
ac *jisou[200001][27];
int zhan[100009],zhen;
char ystr[100005];
int zimu;
ac *tui(ac *now)
{ int jishu=0;
zimu = ystr[i] - 'a';if(zhan[zhen-1]>=0&&jisou[zhan[zhen-1]][zimu]!=NULL)return jisou[zhan[zhen-1]][zimu];while (now->xia[zimu] == NULL && now != root) now = now->fail,++jishu;now = now->xia[zimu];if(now==NULL)now=root;if(zhan[zhen-1]>=0) jisou[zhan[zhen-1]][zimu]=now;//if(jishu>2)cout<<i<<" "<<"gg";return now;
}ac *f[100008];
void work()
{ //cout<<"ppp";// ac *shang=root;zhan[0]=100005;f[100005]=root;int fin=strlen(ystr);for(i=0;i<fin;i++){zhan[++zhen]=i;f[i]=tui(f[zhan[zhen-1]]);if(f[i]->ci){zhen-=changdu[f[i]->ci];}}for(i=1;i<=zhen;i++){printf("%c",ystr[zhan[i]]);}}int main() {
// freopen("censor.in","r",stdin);
// freopen("censor.out","w",stdout);int n, t;scanf("%s", ystr);zhen1 = zhen2 = 0;root = new ac();scanf("%d", &n);for(i=1;i<=n;i++){scanf("%s",s1);insert(s1, root);changdu[i]=strlen(s1);}// cout<<strlen(ystr)<<" ";shipei(root);//cout<<"pp";work();return 0;
}
2017.3.15 审查(黄金) 思考记录相关推荐
- 2017.9.15 最大数maxnumber 思考记录
数论太难了,就水水结构 都是splay的基本操作,维护最大值和size即可 插入时直接找右子树 查找时往左边找 数据结构不对拍就不要交(奇奇怪怪的错误) 注意:区间合并时要考虑自己这个节点 码: #i ...
- 2017.6.15 数字表格 思考记录
利用gcd相同数相乘,可以比较基础的化到 然后就是设T=ij,利用除法了 但这个西格玛在指数上,怎么办呢? 其实是不影响的,只要保证约数.倍数关系对好就行了 易错点: 1.大量取模逆元快速幂 2.m/ ...
- 2017.5.15 项链工厂 思考记录
有是神烦码力费时题. 对于不同的操作只需要抓住一个原则: 顺时针是+ 逆时针是- F是顺逆互换 所以就可以打 区间赋值线段树了(和颜色种数没关系) 犯得错误:1. 开数组 << ...
- 2017.3.24 分裂游戏 思考记录
事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了.. 感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...
- 2017.10.29 染色方案 思考记录
这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...
- 2017.10.24 上升序列 思考记录
终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...
- 2017.10.7 括号序列 思考记录
这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...
- 2017.9.28 约数研究 思考记录
这个题一开始可能会想复杂, 然而它需要对答案的贡献进行归类 可以发现,一个约数对其倍数的数贡献是一样的,,所以可以考虑离散 所以直接对于每个数不好求,就可以考虑每个约数的贡献 而每个约数i就有n/i个 ...
- 2017.9.24 虔诚的墓主人 思考记录
这个题是纯信息处理题. 首先要明白,对墓地进行枚举是会T的,需要对常青树进行枚举 所以枚举的顺序也要注意:一定要按某种顺序 然后要明白,每一个常青树会对列和行都造成影响,对答案有贡献的点只会在两个点之 ...
最新文章
- lvm讲解 磁盘故障小案例
- python语言翻译-教你用Python抓取百度翻译
- mysql udf提权_mysql——udf提权
- 虚拟机安装CentOS,网络配置
- 如何对SAP Leonardo上的机器学习模型进行重新训练
- shell 获取MD5值
- redis 命令行 操作
- 分布式发布订阅模型网络的实现有哪些
- Photoshop 入门教程,处理图层「4」如何向多图层图像中添加更多图像?
- 14.卷2(进程间通信)---System V 共享内存区
- 搜索神器Everything的功能技巧(非NTFS文件搜索,FTP/HTTP服务)
- html毕业设计任务要求,毕业设计任务及进度安排|毕业设计进度安排
- 2013应届毕业生“艺龙旅行网”校招应聘总结
- winform之修改图标
- linux离线日志分析工具,loganalyzer——日志分析工具
- matlab向量的简单随机抽样,matlab随机抽样
- 怎样压缩Word文档,Word压缩技巧分享
- char* char[] char** char*[] char[][]详解
- IE常见问题解决方案大全
- 单片机片内存储器烧写
热门文章
- C++ 各类树的算法
- Python绘制sigmoid函数及其导数图像
- mongodb的条件查询笔记
- mysql返回值_mysql_query的返回值
- mysql分组查询后插入新表,MySQL获取分组后的TOP 1和TOP N记录
- python加密字符串小写字母循环后错两位_python数据类型_字符串常用操作(详解)
- LoRa、LoRaWAN及网关相关技术介绍
- python快递分拣小程序_利用Python开发的ATM小程序
- 在centos7上使用Docker安装oracle 11g
- python的动态参数