关闭

URAL 1354 Palindrome. Again Palindrome (回文 + KMP)

标签: URAL1354Palindrome. Again Pa回文KMP
136人阅读 评论(0) 收藏 举报
分类:
#include <stdio.h>

char string[10001];
char reverseString[10001];
int next[10001];

int main(){

	scanf("%s", string);
	int len = 0;
	int index;
	for (index = 0; string[index] != '\0'; index++){
		len++;
	}

	int reverseIndex = 0;
	for (index = len - 1; index >= 0; index--){
		reverseString[reverseIndex++] = string[index];
	}
	reverseString[reverseIndex] = '\0';

	int prefix = -1;
	int suffix = 0;
	next[suffix] = -1;
	//注意边界不是len
	while (suffix < len - 1){
		if (-1 == prefix || reverseString[prefix] == reverseString[suffix]){
			prefix++;
			suffix++;
			if (reverseString[prefix] != reverseString[suffix]){
				next[suffix] = prefix;
			} else {
				next[suffix] = next[prefix];
			}
		} else {
			prefix = next[prefix];
		}
	}

	//用KMP算法求输入字符的反串的前缀在输入字符串第1个字符之后的位置
	index = 1;
	reverseIndex = 0;
	while (index < len){
		if (string[index] == reverseString[reverseIndex] || -1 == reverseIndex){
			index++;
			reverseIndex++;
		} else {
			reverseIndex = next[reverseIndex];
		}
	}

	printf("%s", string);
	while (reverseIndex < len){
		printf("%c", reverseString[reverseIndex++]);
	}
	printf("\n");	

	return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:33354次
    • 积分:2124
    • 等级:
    • 排名:第18010名
    • 原创:187篇
    • 转载:2篇
    • 译文:0篇
    • 评论:4条
    最新评论