P3435 [POI2006]OKR-Periods of Words

我佛了,跪求老师下午对KMP的一些具体题目进行分析,我仍记得我昨天晚上两道kmp阅读理解给我带来的恐惧(当然也有可能是我太弱了。。)

阅读理解1.。

我说真的,这题就tm是语文题,理科生做个p,在tj的帮助下花了45+分钟理解题意,然后15分钟敲个板子,并加入一个ans变量统计总数,就过了??

所以说老贾还是有必要花一堂课时间带我们看各类莫名的题面,给我们理解一下,顺便,教个语文。。

 1 #include<set>
 2 #include<map>
 3 #include<list>
 4 #include<queue>
 5 #include<stack>
 6 #include<string>
 7 #include<cmath>
 8 #include<ctime>
 9 #include<vector>
10 #include<bitset>
11 #include<memory>
12 #include<utility>
13 #include<cstdio>
14 #include<sstream>
15 #include<iostream>
16 #include<cstdlib>
17 #include<cstring>
18 #include<algorithm>
19 using namespace std;
20 
21 int n;
22 long long ans;
23 int next[1000010];
24 char y[1000010];
25 
26 void zy(){//预处理next数组
27     for(int i=1,j=0;i<n;i++){
28         while(j>0&&y[i]!=y[j]){
29             j=next[j];
30         }
31         if(y[i]==y[j]){
32             j++;
33         }
34         next[i+1]=j;
35     }
36 }
37 
38 void KMPMatch(){//kmp板子,加个ans作为输出答案
39     for(int i=1,j;i<=n;i++){
40         j=i;
41         while(next[j]!=0){
42             j=next[j];
43         }
44         if(next[i]){
45             next[i]=j;
46         }
47         ans+=i-j;
48     }
49 }
50 
51 int main(){
52     scanf("%d",&n);
53     cin>>y;//读入
54     zy();
55     KMPMatch();
56     printf("%lld",ans);//输出,记得要用longlong
57 }

我说啥??是不是板子??要是考场上碰到这题理解不了那岂不亏死。。。

猜你喜欢

转载自www.cnblogs.com/hahaha2124652975/p/11137553.html