UVa 11475 - Extend to Palindrome

題目:給你一個字符串,在後面拼接一部分使得它變成回文串,使得串最短,輸出這個回文串。

分析:KMP,dp。這裡利用KMP算法將串和它的轉置匹配,看結束時匹配的長度即可。

            因為串比較長,使用KMP比較合適,KMP原理請參照AC自動機總結

說明:╮(╯▽╰)╭。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char strA[100001];
char strB[100001];
int  next[100001];

void getnext(char T[])  
{  
    next[0] = -1;
    int i = 0, j = -1;  
    while (T[i]) {  
        if (j == -1 || T[i] == T[j]) {
			++ i; ++ j;
			if (T[i] != T[j])
				next[i] = j;
            else next[i] = next[j];  
        }else j = next[j];  
    }
}  

int KMP(char S[], char T[])
{
	int i = 0, j = 0;
	while (S[i]) {
		if (j == -1 || S[i] == T[j]) {
			i ++; j ++;
		}else j = next[j];
	}
	return j;
}

int main()
{
	while (~scanf("%s",strA)) {
		int len = strlen(strA);
		for (int i = 0; i < len; ++ i)
			strB[i] = strA[len-1-i];
		strB[len] = 0;
		getnext(strB);
		
		printf("%s%s\n",strA,&strB[KMP(strA, strB)]);
	}
    return 0;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mobius_strip/article/details/46819291
上一篇UVa 10803 - Thunder Mountain
下一篇UVa 11466 - Largest Prime Divisor
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭