简单的利用KMP算法进行比较,AC代码如下:
#include <iostream> #define N 10006 using namespace std; void SetNext(string s1,int next[],int size){ next[0] = -1; int i = 0, j = -1; while(i < size){ if(j == -1 || s1[i] == s1[j])next[++i] = ++j; else j = next[j]; } // for(int i = 0; i < size; i++)cout << "next[" << i << "] = " << next[i] << endl; } int KMP(string s1,string s2){ int sum = 0,i = 0,j = 0; int length1 = s1.length(),length2 = s2.length(); int next[N]; SetNext(s1,next,length1); while(i < length1 && j < length2){ if(i == -1 || s1[i] == s2[j]){ if(i == length1 - 1){ j++; sum++; i = 0; }else{ i++; j++; } }else{ i = next[i]; } } return sum; } int main(){ int n; string s2,s1 = "2020"; while(cin >> n){ cin >> s2; cout << KMP(s1,s2) << endl; } return 0; }