现在的位置: 首页 > 综合 > 正文

HDU 4749 && POJ 3167 KMP

2013年10月17日 ⁄ 综合 ⁄ 共 1284字 ⁄ 字号 评论关闭

RT

这个题是POJ3167的修改版,基本一致

 

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
const int N = 100005; 
int x[N], a[N], nex[N]; 
int pr1[N][30], pr2[N][30], n, m, s; 
void init() {
    memset(pr1, 0, sizeof(pr1)); 
    memset(pr2, 0, sizeof(pr2)); 
    pr1[1][x[1]] = pr2[1][a[1]] = 1; 
    for(int i = 2; i <= n; i++) {
        memcpy(pr1[i], pr1[i-1], sizeof(pr1[0])); 
        pr1[i][x[i]]++; 
    }
    for(int i = 2; i <= m; i++) {
        memcpy(pr2[i], pr2[i-1], sizeof(pr2[0])); 
        pr2[i][a[i]]++; 
    }
}
void getnex() {
    memset(nex, 0, sizeof(nex)); 
    int i = 1, j = 0, k, si, sj, ei, ej; 
    nex[1] = 0; 
    while(i <= m) {
        si = sj = ei = ej = 0; 
        for(k = 1; k < a[i]; k++)
            si += pr2[i][k]-pr2[i-j][k]; 
        ei = pr2[i][k]-pr2[i-j][k]; 
        for(k = 1; k < a[j]; k++)
            sj += pr2[j][k]; 
        ej = pr2[j][k]; 
        if(j == 0||(si == sj&&ei == ej))
            i++, j++, nex[i] = j; 
        else j = nex[j]; 
    }
}
void gao() {
    int i, j, k, si, sj, ei, ej, pre = -1, num = 0; 
    for(i = j = 1; i <= n; ) {
        si = sj = ei = ej = 0; 
        for(k = 1; k < x[i]; k++)
            si += pr1[i][k]-pr1[i-j][k]; 
        ei = pr1[i][k]-pr1[i-j][k]; 
        for(k = 1; k < a[j]; k++)
            sj += pr2[j][k]; 
        ej = pr2[j][k]; 
        if(j == 0||(si == sj&&ei == ej))
            i++, j++; 
        else j = nex[j]; 
        if(j == m+1) {
            if (i - 1 - m >= pre) {
                num ++; 
                pre = i - 1; 
            }
            j = nex[j]; 
        }
    }
    printf("%d\n", num); 
}
int main() {
    while(scanf("%d%d%d", &n, &m, &s) != EOF) {
        for(int i = 1; i <= n; i++)
            scanf("%d", &x[i]); 
        for(int i = 1; i <= m; i++)
            scanf("%d", &a[i]); 
        init(); 
        getnex(); 
        gao(); 
    }
    return 0; 
}

抱歉!评论已关闭.