int main() { int nCase; char ch; long long a, b, ans; scanf("%d", &nCase); while (nCase--) { ans = 0; scanf("%s", s); scanf("%s", t); for (int i = 1; t[i]; ++i) { ch = t[i]; t[i] = 0; make_next(t, next[0]); if (NULL == kmp_strstr(s, t, next[0])) continue; t[i] = ch; make_next(t+i, next[1]); if (NULL == kmp_strstr(s, t, next[1])) continue; ch = t[i]; t[i] = 0; a = kmp_str_count(s, t, next[0]); t[i] = ch; b = kmp_str_count(s, t+1, next[1]); ans += a * b; } printf("%lld\n", ans); } return 0; }
/** * 测试 next 数组 **/ void test_next() { char pattern1[] = "pattern"; char pattern2[] = "patternpat"; int* next; int i; printf("%s\n", pattern1); next = make_next(pattern1); for (i = 0 ; i < strlen(pattern1) ; ++i) printf("%d ", next[i]); printf("\n"); printf("%s\n", pattern2); next = make_next(pattern2); for (i = 0 ; i < strlen(pattern2) ; ++i) printf("%d ", next[i]); printf("\n"); }
bool Job::reschedule() { JobPtr next = make_next(); if (!next) return false; queue_->enqueue(next); return true; }
char* kmp_strstr(char s[], char t[]) { int k = -1; int nl = make_next(t, next); for (int i = 0; s[i] != '\0'; i++) { while (k >= 0 && s[i] != t[k+1]) k = next[k]; if (s[i] == t[k+1]) k++; if (t[k+1] == '\0') return &s[i-k]; } return NULL; }
int main() { while (EOF != scanf("%s", s) && !(s[0] == '.' && s[1] == '\0')) { int sl = make_next(s, next); int l = sl - 1 - next[sl-1]; int ans = 1; if (sl % l == 0) { ans = sl / l; } printf("%d\n", ans); } return 0; }
int kmp(const char* source, const char* pattern) { int source_length, pattern_length; int i = -1, q = 0; int* next; source_length = strlen(source); pattern_length = strlen(pattern); next = make_next(pattern); while(++i < source_length) { while(q > 0 && pattern[q] != source[i]) q = next[q-1]; if (pattern[q] == source[i]) ++q; if (q == pattern_length) return i - pattern_length + 1; } return -1; }
int strStr(string haystack, string needle) { if(needle.size() == 0 || haystack == needle) return 0; int hsize = haystack.size(), nsize = needle.size(); int k = -1; vector<int> next = make_next(needle, nsize); for(int i = 0; i < hsize; i++) { while(k > -1 && haystack[i] != needle[k+1]) k = next[k]; if(haystack[i] == needle[k+1]) k += 1; if(k == nsize - 1) return i - nsize + 1; } return -1; }
int kmp(const string &needle, const string &haystack) { int n = haystack.length(); int m = needle.length(); if (m == 0) return 0; vector<int> next(m); make_next(needle, next); int j = 0; for (int i=0; i<n; i++) { while (j>0 && needle[j] != haystack[i]) { j = next[j-1]; } if (needle[j] == haystack[i]) { j++; } if (j == m) return i-j+1; } return -1; }