ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

匹配统计

2020-07-11 18:03:44  阅读:222  来源: 互联网

标签:匹配 int res next 题解 nt 统计


传送门:https://www.acwing.com/problem/content/162/(acwing有视频讲解,题解,数据之类的)

题意:给你两个字符串a和b,有q次询问,每次询问输出a的所有后缀和b恰好匹配长度为x的后缀个数。

题解:这个题好微妙啊,我换了两种思路都不太对。然后看了一下大雪菜老师的视频和(传送门)这个题解,豁然开朗。

先求出 b 串的 next 数组,然后a和b串进行匹配。a 串遍历用 i,b串用 j,j 正好是b串能匹配以 i 为结尾的a串的长度,所以就是以 i-j+1 为头的串。根据 kmp 中 next 数组的性质以 i-next[j]+1 的串和 b 恰好匹配的长度也为 j,然后依次套娃...直到 next[j]==-1 结束,用 res[j] 记录。但是这样套娃时间复杂度太大了O(nm)(菜鸡不会算嘤嘤嘤,借助大佬的时间复杂度),其实这就是一个拓扑的结构,只要最后记录完之后在算就会节省很多时间。res[x] 记录的是匹配的前缀至少为 x 的后缀数量,但我们要求的是恰好为x的数量,所以减去 res[x+1] 就是答案了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int nt[200100];
 5 int res[200100];
 6 map<int,int>p;
 7 
 8 void getnext(string p)
 9 {
10     nt[0]=-1;
11     int i=0,j=-1;
12     int len=p.size();
13     while(i<len){
14         if(j==-1||p[i]==p[j]){
15             i++,j++;
16             nt[i]=j;
17         }
18         else j=nt[j];
19     }
20 }
21 
22 void kmp(string t,string p)
23 {
24     getnext(p);
25     int i=0,j=0;
26     int lt=t.size(),lp=p.size();
27     while(i<lt){
28         if(j==-1||t[i]==p[j]){
29             i++,j++;
30             res[j]++;
31         }
32         else j=nt[j];
33     }
34 }
35 
36 int main()
37 {
38     ios::sync_with_stdio(false);
39     cin.tie(0);
40     cout.tie(0);
41     int n,m,t;
42     cin>>n>>m>>t;
43     string a,b;
44     cin>>a>>b;
45     kmp(a,b);
46     for(int i=n;i>=1;i--) res[nt[i]]+=res[i];
47     while(t--){
48         int x;
49         cin>>x;
50         cout<<res[x]-res[x+1]<<endl;
51     }
52     return 0;
53 }

 

标签:匹配,int,res,next,题解,nt,统计
来源: https://www.cnblogs.com/lilibuxiangtle/p/13284556.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有