ZOJ3228 Searching the String(AC自动机)

题目大概是给一个主串,询问若干个模式串出现次数,其中有些模式串要求不能重叠。

对于可以重叠的就是一个直白的多模式匹配问题;而不可重叠,在匹配过程中贪心地记录当前匹配的主串位置,然后每当出现一个新匹配根据记录的位置判断这个新匹配是否成立,最后更新位置。

另外,考虑到数据可以出现多个模式串相同的情况,实现要做一些处理:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MAXN 666666
 7 //-1 none, 0 overlap, 1 not, 2 both
 8 int tn,ch[MAXN][26],fail[MAXN],flag[MAXN],len[MAXN];
 9 int insert(char *s,int k){
10     int x=0,l=0;
11     for(int i=0; s[i]; ++i){
12         int y=s[i]-'a';
13         if(ch[x][y]==0) ch[x][y]=++tn;
14         x=ch[x][y];
15         ++l;
16     }
17     len[x]=l;
18     if(flag[x]==-1) flag[x]=k;
19     else if(flag[x]==0 && k==1) flag[x]=2;
20     else if(flag[x]==1 && k==0) flag[x]=2;
21     return x;
22 }
23 void getfail(){
24     memset(fail,0,sizeof(flag));
25     queue<int> que;
26     for(int i=0; i<26; ++i){
27         if(ch[0][i]) que.push(ch[0][i]);
28     }
29     while(!que.empty()){
30         int x=que.front(); que.pop();
31         for(int i=0; i<26; ++i){
32             if(ch[x][i]){
33                 que.push(ch[x][i]);
34                 fail[ch[x][i]]=ch[fail[x]][i];
35             }else ch[x][i]=ch[fail[x]][i];
36         }
37     }
38 }
39 int last[MAXN],ans[2][MAXN],first[111111],second[111111];
40 char str[111111];
41 void query(){
42     int x=0;
43     for(int i=0; str[i]; ++i){
44         int y=str[i]-'a';
45         int tmp=x=ch[x][y];
46         while(tmp){
47             if(flag[tmp]!=-1 && flag[tmp]!=1) ++ans[0][tmp];
48             if(flag[tmp]!=-1 && flag[tmp]!=0){
49                 if(last[tmp]==-1 || i-last[tmp]>=len[tmp]){
50                     last[tmp]=i;
51                     ++ans[1][tmp];
52                 }
53             }
54             tmp=fail[tmp];
55         }
56     }
57 }
58 int main(){
59     int n,cse=0;
60     char s[11];
61     while(~scanf("%s",str)){
62         tn=0;
63         memset(ch,0,sizeof(ch));
64         memset(flag,-1,sizeof(flag));
65         scanf("%d",&n);
66         for(int i=0; i<n; ++i){
67             scanf("%d%s",&first[i],s);
68             second[i]=insert(s,first[i]);
69         }
70         getfail();
71         memset(ans,0,sizeof(ans));
72         memset(last,-1,sizeof(last));
73         query();
74         printf("Case %d\n",++cse);
75         for(int i=0; i<n; ++i){
76             printf("%d\n",ans[first[i]][second[i]]);
77         }
78         putchar('\n');
79     }
80     return 0;
81 }

 

转载于:https://www.cnblogs.com/WABoss/p/5353733.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值