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/。只有经过作者同意转载。

  • 相关阅读:
    web前端的发展态势
    AngularJs 简单入门
    css代码优化篇
    git提交报错:Please make sure you have the correct access rights and the repository exists.
    Activiti工作流框架学习
    遍历map集合的4种方法
    js设置日期、月份增加减少
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    webservice_rest接口_学习笔记
    相互匹配两个list集合+动态匹配${}参数
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4758076.html
Copyright © 2011-2022 走看看