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

时间:2014-03-05 18:17:06   收藏:0   阅读:474

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

题解:KMP next函数的应用。

 

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

HDU 4300 Clairewd’s message (next函数的应用),布布扣,bubuko.com

原文:http://www.cnblogs.com/GBRgbr/p/3581164.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!