字符串
hash
#include<cstdio> #include<cstring> #define ull unsigned long long using namespace std; ull power[1000005],sum[1000005]; char s1[10005],s2[1000005]; int main() { int t,b = 26; scanf("%d",&t); power[0] = 1; for(int i = 1;i <= 1000000;i++) power[i] = power[i - 1] * b; while(t--) { scanf("%s%s",s1 + 1,s2 + 1); int n = strlen(s1 + 1),m = strlen(s2 + 1); sum[0] = 0; for(int i = 1;i <= m;i++) sum[i] = sum[i - 1] * b + (ull)(s2[i] - 'A' + 1); ull s = 0; for(int i = 1;i <= n;i++) s = s * b +(ull)(s1[i] - 'A' + 1); int ans = 0; for(int i = 0;i <= m - n;i++) if(s == sum[i + n] - sum[i] * power[n]) ans++; printf("%d ",ans); } return 0; }
kmp
#include<cstdio> #include<cstring> using namespace std; const int N = 1010; char a[N],b[N]; int n,m; int nxt[N]; void prepare() { nxt[1] = 0; int j = 0; for(int i = 1;i < m;i++) { while(j > 0 &&b[j + 1] != b[i + 1]) j = nxt[j]; if(b[j + 1] == b[i + 1]) j++; nxt[i + 1] = j; } } int kmp() { int ans = 0,j = 0; for(int i = 0;i < n;i++) { while(j > 0 && b[j + 1] != a[i + 1]) j = nxt[j]; if(b[j + 1] == a[i + 1]) j++; if(j == m) { j = 0; ans++; } } return ans; } int main() { while(~scanf("%s",a+1)) { n = strlen(a + 1); if(a[1] == '#' && n == 1) break; scanf("%s",b+1); m = strlen(b + 1); prepare(); printf("%d ",kmp()); } return 0; }