Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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");
}
Ejemplo n.º 3
0
bool Job::reschedule()
{
	JobPtr next = make_next();
	if (!next)
		return false;

	queue_->enqueue(next);
	return true;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
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;
}
Ejemplo n.º 7
0
 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;
 }
Ejemplo n.º 8
0
 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;
 }