我佛了,跪求老师下午对KMP的一些具体题目进行分析,我仍记得我昨天晚上两道kmp阅读理解给我带来的恐惧(当然也有可能是我太弱了。。)
我说真的,这题就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 }
我说啥??是不是板子??要是考场上碰到这题理解不了那岂不亏死。。。