题意:

给出n个单词,问又多少个在模式串中出现过,单词反转后在模式串中出现也算出现。模式串会这么给出,例如"[3A]"代表"AAA",这个数字最大会是5000000,原串的长度也是5000000,比赛的时候我就以为经过翻译的串会变成5000000*5000000这么长,可是赛后一看,题中说了,翻译之后的串也不会超过5000000,真是日了狗= =,

思路:

裸的AC自动机,我最初的想法是把每个串既正着插进字典树,也反着插一遍,结果WA了,后来想想,果然有WA点,这样一个穿可能被算了两次啊,我们可以把模式串正着跑一遍,反着再跑一遍,这样就可以了。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;const int kind=26;//结点有26种,a~z
struct node
{node *fail;//失败指针node *next[kind];int count;node(){fail=NULL;count=0;memset(next,NULL,sizeof(next));}
}*q[5100050];//队列用于bfs构造失败指针char keyword[1050];//输入的单词
char keyword1[1050];
char str[5100050];//模式串
int head,tail;//队列头和尾
char str1[5100050];void insert(char *str,node *root)
{node *p=root;int i=0,index;while(str[i]){index=str[i]-'A';if(p->next[index]==NULL)p->next[index]=new node();p=p->next[index];i++;}p->count++;
}void build_ac(node *root)
{int i;root->fail=NULL;q[head++]=root;while(head!=tail){node *temp=q[tail++];node *p=NULL;for(int i=0;i<26;i++){if(temp->next[i]!=NULL){if(temp==root)temp->next[i]->fail=root;else{p=temp->fail;while(p!=NULL){if(p->next[i]!=NULL){temp->next[i]->fail=p->next[i];break;}p=p->fail;}if(p==NULL)temp->next[i]->fail=root;}q[head++]=temp->next[i];}}}
}int query(node *root)
{int i=0,cnt=0,index,len=strlen(str);node *p=root;while(str[i]){index=str[i]-'A';while(p->next[index]==NULL&&p!=root)p=p->fail;p=p->next[index];p=(p==NULL)?root:p;node *temp=p;while(temp!=root&&temp->count!=-1){cnt+=temp->count;temp->count=-1;temp=temp->fail;}i++;}return cnt;
}void trans()
{int j=0;int len=strlen(str1);for(int i=0;i<len;i++){if(isalpha(str1[i])) str[j++]=str1[i];else {i++;int t=0;while(isdigit(str1[i])) {t=t*10+str1[i]-'0';i++;}for(int jj = 0; jj < t; ++jj) str[j++]=str1[i];i++;}}str[j++]=0;
}int main()
{int t;scanf("%d",&t);while(t--){int n;head=tail=0;node *root=new node();scanf("%d",&n);getchar();while(n--){gets(keyword);
//          puts(keyword);insert(keyword,root);//   int len=strlen(keyword);// for(int i=0,j=len-1;i<len;i++,j--)//     keyword1[i]=keyword[j];//  keyword1[len]=0;// insert(keyword1,root);
//          printf("lalalalala\n");}//printf("--------------------1\n");build_ac(root);scanf("%s",str1);//printf("%s\n",str);trans();
//      printf("=================- %s\n",str1);//    printf("-----------------= %s\n",str);int ans=query(root);int len=strlen(str);for(int i=0,j=len-1;i<len;i++,j--)str1[i]=str[j];for(int i=0;i<len;i++)str[i]=str1[i];ans+=query(root);printf("%d\n",ans);}
}

hdu3695(AC自动机)相关推荐

  1. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

  2. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  3. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

  4. Keywords Search AC自动机QAQ

    AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...

  5. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  6. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

  7. HDU2896(AC自动机模版题)

    AC自动机模版题: 方法一:超时 #include<iostream> #include<algorithm> #include<cstring> #include ...

  8. HDU2222(AC自动机模版题)

    AC自动机是Trie树和KMP的结合物,但是其实KMP在这里体现了思想,而Trie树才是最重要的,要想学懂AC自动机,学习Trie树是必须的,这些是自己在学习AC自动机的个人看法,我也是在网上学习了大 ...

  9. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

最新文章

  1. C++实现有哨兵的双向循环链表
  2. Delphi XE5 常见问题解答
  3. VS IISExpress REST DELETE 405 Method Not Allowed
  4. Mysql学习总结(42)——MySql常用脚本大全
  5. Linux 探索之旅 | 第五部分第六课:一朝 Shell 函数倾,斗转星移任我行
  6. python 2.7.9 安装beautifulsoup4
  7. 3dmax人物模型制作全的步骤
  8. javascript实现的中国象棋单机双人
  9. 使用Arduino和Node.js实现网页界面控制LED的亮度
  10. Web基础知识与常用技术
  11. 外币折算、汇兑损益、重估
  12. Miniconda安装TensorFlow并导入Pycharm
  13. 计算Fisher信息之Part(二)
  14. 【DB宝3】在Docker中使用rpm包的方式安装Oracle 19c
  15. FL Studio20.8完整版注册密钥下载有哪些新功能?
  16. 汇编语言实验五-《汇编语言-王爽老师》
  17. P2P 应用程序框架
  18. 0.0.0.0和255.255.255.255
  19. 基于STM32F103的红外循迹避障小车设计(含Proteus仿真)
  20. 用户决定Windows的CPU占用率

热门文章

  1. 科大星云诗社动态20210208
  2. Fill in blank -Thermal experiment theory and technology2018-01-06
  3. RDD 与 DataFrame原理-区别-操作详解
  4. 混合模型的推荐算法(ACM暑校-案例学习)
  5. VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D
  6. 数据可视化组队学习:《Task04 - 文字图例尽眉目》笔记
  7. 【CyberSecurityLearning 28】批处理与简单病毒
  8. pikachu皮卡丘靶机系统安装~
  9. python eval()函数用法以及可能出现的问题
  10. Linux 进程管理命令