http://acm.hdu.edu.cn/showproblem.php?pid=2087
stl_strng
#include<iostream> #include<string> #include<cmath> using namespace std ; int main() { int temp , sum ; string str1 , str2 ; while( cin >> str1 && str1 != "#" ) { cin >> str2 ; sum = temp = 0 ; while(( temp = str1.find( str2 , temp )) != string::npos ) { sum++ ; temp += str2.size(); } cout << sum << endl ; } return 0 ; }
kmp
#include<vector> #include<list> #include<map> #include<set> #include<deque> #include<stack> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; const int maxn = 50005 ; int next[ maxn ] , ex[ maxn ] ; char str1[ maxn ] , str2[ maxn ] ; int len1 , len2 ; void getNext(char *T) { int j,k; k=1; j=0; while(k<len2) { if(j==0 ||T[k]==T[j]) { ++j; ++k; if(T[ k ] == T[ j ] ) next[ k ] = next[ j ] ; else next[k]=j; } else j=next[j]; } } int get_ex(char *ob,char *sub) { int k , j ; j=0; k=0; int sum = 0 ; while(k<=len1) { if(j==0||ob[k]==sub[j]) { if( j == len2 ) { sum++ ; j = 0 ; } ++j; ++k; //ex[i]=k; } else j=next[j]; } return sum ; } int main() { while( scanf( "%s" , str1 + 1 ) != EOF && str1[ 1 ] != '#' ) { scanf( "%s" ,str2 +1 ) ; len1 = strlen( str1 + 1) ; len2 = strlen( str2 + 1); getNext(str2); int ans = get_ex( str1 ,str2 ); printf( "%d\n",ans); } return 0; }