1、HDU 2087
2、题意:一个主串,一个子串,求子串在主串里出现了几次。
3、总结:看了题解,还是不太懂。。
//#include<iostream>#include<cmath>#include<queue>#include<algorithm> //不明白为什么加上这些头文件就Compilation Error #include<cstring> #include<cstdio> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 1010; char a[N],b[N]; int next[N],lena,lenb; void getnext() //这里还是看不明白 { int i=0,k=-1; next[0]=-1; while(i<lenb) { if(k==-1||b[i]==b[k]) { i++; k++; next[i]=k; } else k=next[k]; } } int KMP() { getnext(); int i=0,j=0,cnt=0; while(i<lena) { if(j==-1||a[i]==b[j]) { i++; j++; } else { j=next[j]; } if(j==lenb) { cnt++; j=0; //若两个不同的匹配没有交集则j=0,若存在交集则j=next[j]; } } return cnt; } int main() { while(~scanf("%s",a) && a[0]!='#') { scanf("%s",b); lena=strlen(a); lenb=strlen(b); printf("%d ",KMP()); } return 0; }