HDU 4300 Clairewd’s message (next函数的应用)

题意:给你一个明文对密文的字母表,在给你一段截获信息,截获信息前半段是密文,后半段是明文,但不清楚它们的分界点在哪里,密文一定是完整的,明文可能是残缺的,求完整的信息串(即完整的密文+明文串)。

题解:KMP next函数的应用。

 

#include <cstdio>
#include <cstring>
#include <cstdlib>

const int MAXN = 100010;

char table[32];
char extable[32];
char ori[MAXN];
char aft[MAXN];
int next[MAXN];
int  len;

void init()
{
    for ( int i = 0; i < 26; ++i )
        extable[ table[i]-'a' ] = 'a' + i;

    len = strlen(ori);
    for ( int i = 0; i < len/2; ++i )
        aft[i] = ori[i];

    for ( int i = len/2; i < len; ++i )
        aft[i] = table[ ori[i] - 'a' ];

    aft[len] = '\0';

    return;
}

void getNext( char* s, int* next )
{
    int length = len;
    int i = 0, j = -1;
    next[0] = -1;
    while ( i < length )
    {
        if ( j == -1 || s[i] == s[j] )
        {
            ++i, ++j;
            next[i] = j;
        }
        else j = next[j];
    }
}

int main()
{
    int T;
    scanf( "%d", &T );
    while ( T-- )
    {
        scanf( "%s", table );
        scanf( "%s", ori );
        init();
        getNext( aft, next );

        int ans = len;
        //printf("next[%d] = %d\n", ans, next[ans] );
        while ( next[ans] > len/2 ) ans = next[ans];
        ans = len - next[ans];
        //printf( "ans = %d\n", ans );
        for ( int i = 0; i < ans; ++i )
            printf( "%c", ori[i] );
        for ( int i = 0; i < ans; ++i )
            printf( "%c", extable[ ori[i] - 'a' ] );
        puts("");
    }
    return 0;
}

 

posted @ 2014-03-05 08:53  冰鸮  阅读(266)  评论(0编辑  收藏  举报