hdu2203KMP

比较赤裸的KMP,将主串延长一倍即可达到旋转匹配的效果。

/*

 * hdu2203/win.cpp

 * Created on: 2012-7-28

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <iostream>

#include <queue>

using namespace std;

const int MAX_PAR_LEN = 100005;

const int MAX_TXT_LEN = 200005;

char pattern[MAX_PAR_LEN], text[MAX_TXT_LEN];

int nextval[MAX_PAR_LEN], parlen, txtlen;

void get_nextval() {

    int i = 0, j = -1;

    nextval[0] = -1;

    while (i < parlen) {

        if (j < 0 || pattern[i] == pattern[j]) {

            i++;

            j++;

            if (pattern[i] != pattern[j]) {

                nextval[i] = j;

            } else {

                nextval[i] = nextval[j];

            }

        } else {

            j = nextval[j];

        }

    }

}

int index_kmp() {

    int i, j;

    txtlen = strlen(text);

    parlen = strlen(pattern);

    get_nextval();

    i = j = 0;

    while (i < txtlen && j < parlen) {

        if (j < 0 || text[i] == pattern[j]) {

            i++;

            j++;

        } else {

            j = nextval[j];

        }

    }

    if (j == parlen) {

        return i - j;

    } else {

        return -1;

    }

}



int main() {

#ifndef ONLINE_JUDGE

    freopen("data.in", "r", stdin);

#endif

    while(scanf("%s%s", text, pattern) == 2) {

        int len = strlen(text);

        if((int)strlen(pattern) > len) {

            puts("no");

            continue;

        }

        memcpy(&text[len], text, len - 1);

        text[2 * len - 1] = 0;

        if(index_kmp() < 0) {

            puts("no");

        }else {

            puts("yes");

        }

    }

    return 0;

}

你可能感兴趣的:(HDU)