zoukankan      html  css  js  c++  java
  • HDU 1867 A + B for you again KMP解决问题的方法

    这是一个典型问题KMP申请书。

    结果求增加两个字符串。该法的总和是相同的前缀和后缀也是字符串的字符串,您将可以合并本节。

    但是,这个问题是不是问题非常明确的含义,因为不是太清楚,外观这两个字符串的顺序无关紧要,后只需要输出的最短的组合长度的结果,并后长度一样,那么就依照字典顺序,输出字典顺序在前的字符串。

    思路:

    1 使用kmp在s2查找s1,那么终于结束的时候next table的值就是s1前缀和s2的后缀同样的最长的长度了。

    2 输入两个字符串s1和s2。那么就能够在s2中查找s1。得到长度len1,s1中查找s2,得到长度len2,比較len1和len2的长短,就能够确定输出哪个字符串了。


    const int MAX_N = (int)1E5 + 1;
    char s1[MAX_N], s2[MAX_N];
    int L1, L2, nxt[MAX_N];
    
    void genTbl(char *str, int len)
    {
    	memset(nxt, 0, sizeof(int) * len);//又一个忘记清零错误
    	for (int i = 1, j = 0; i < len; )
    	{
    		if (str[i] == str[j]) nxt[i++] = ++j;
    		else if (j > 0) j = nxt[j-1];
    		else i++;//不清零,也能够nxt[i++] = 0;前面写nxt[0] = 0;
    	}
    }
    
    void getLongestPreSuf(int &j, char *str1, char *str2, int len1, int len2)
    {
    	genTbl(str1, len1);
    	j = 0;
    	int i = 0;
    	for (; i < len2; )
    	{
    		if (str2[i] == str1[j]) i++, j++;
    		else if (j > 0) j = nxt[j-1];
    		else i++;
    	}
    }
    
    void printStr(char *str1, char *str2, int l1, int l2, int len)
    {
    	for (int i = 0; i < l1; i++) putchar(str1[i]);
    	for (int i = len; i < l2; i++) putchar(str2[i]);
    	putchar('
    ');
    }
    
    int main()
    {
    	while (scanf("%s", s1) != EOF)
    	{
    		scanf("%s", s2);
    		L1 = strlen(s1);
    		L2 = strlen(s2);
    		int len1 = 0, len2 = 0;
    		getLongestPreSuf(len1, s1, s2, L1, L2);
    		getLongestPreSuf(len2, s2, s1, L2, L1);
    		if (len1 < len2)
    		{
    			//printStr(s1, s2, L1, L2, len2);
    			printf("%s%s
    ", s1, s2+len2);
    		}
    		else if (len2 < len1)
    		{
    			//printStr(s2, s1, L2, L1, len1);
    			printf("%s%s
    ", s2, s1+len1);
    		}
    		else
    		{
    			//if (strcmp(s1, s2) < 0) printStr(s1, s2, L1, L2, len2);
    			//else printStr(s2, s1, L2, L1, len1);
    			if (strcmp(s1, s2) < 0) printf("%s%s
    ", s1, s2+len2);
    			else printf("%s%s
    ", s2, s1+len1);
    		}
    	}
    	return 0;
    }


    版权声明:笔者靖心脏。景空间地址:http://blog.csdn.net/kenden23/。只有经过作者同意转载。

  • 相关阅读:
    2. redis的数据类型
    1. redis简介
    6. 职责链设计模式
    9. 桥梁设计模式
    一. 序言
    网络中常见的面试题
    JDBC
    Mybatis批量操作数据的方法
    ORM框架的概述
    Mybatis动态sql技术
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4758076.html
Copyright © 2011-2022 走看看