HDU 1867 A + B for you again kmp算法
来源:互联网 发布:mac 连不上appstore 编辑:程序博客网 时间:2024/06/05 19:30
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1867
题意:给定两个字符串,把一个字符串接在另一个字符串的后面,相接部位若有相同,则可以略去其中一个字符串的相同部分,输出拼接后最小长度的字符串,若有两种最小长度的字符串,输出字典序较小的那个
思路:可以用kmp匹配一个字符串的尾部和另一个字符串的首部相同的最大长度,然后交换两个字符串的次序,再来一次匹配,根据匹配出来的长度来决定把那个字符串放在前面
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 100010;int nt[N];char s1[N], s2[N];void getnt(char s[]){ int i = 0, j = -1; nt[0] = -1; while(s[i]) { if(j == -1 || s[i] == s[j]) { i++, j++; if(s[i] != s[j]) nt[i] = j; else nt[i]= nt[j]; } else j = nt[j]; }}int kmp(char s1[], char s2[]) //s1是目标串,s2是模式串{ getnt(s2); int i = 0, j = 0; while(s1[i]) { if(j == -1 || s1[i] == s2[j]) i++, j++; else j = nt[j]; if(j != -1 && !s2[j] && s1[i]) //s2匹配到末端时,要判断s1是不是末端,若不是末端,则令j跳转,若是末端,则保持j不变 j = nt[j]; } return j;}int main(){ while(~ scanf("%s%s", s1, s2)) { int l1 = kmp(s1, s2); //s1的尾部和s2的首部匹配的长度 int l2 = kmp(s2, s1); //s2的尾部和s1的首部匹配的长度 if(l1 > l2) { printf("%s", s1); printf("%s", s2 + l1); } else if(l1 < l2) { printf("%s", s2); printf("%s", s1 + l2); } else { if(strcmp(s1, s2) < 0) { printf("%s", s1); printf("%s", s2 + l1); } else { printf("%s", s2); printf("%s", s1 + l2); } } printf("\n"); } return 0;}
0 0
- hdu 1867 A + B for you again KMP算法
- HDU 1867 A + B for you again kmp算法
- hdu 1867 A + B for you again KMP算法
- hdu -- 1867 A + B for you again (KMP)
- hdu 1867——A + B for you again(KMP)
- KMP-hdu-1867 A + B for you again
- hdu 1867 A + B for you again (KMP)
- HDU 1867 A + B for you again KMP
- hdu 1867 KMP A + B for you again
- HDU 1867 A + B for you again(简单KMP)
- HDU 1867 A + B for you again (KMP)
- HDU(1867)A + B for you again (KMP)
- hdu 1867 A + B for you again (kmp)
- hdu 1867 A + B for you again kmp
- hdu 1867 A + B for you again(KMP)
- hdu 1867 A + B for you again(KMP)
- HDU 1867 A + B for you again KMP题解
- HDU 1867 A + B for you again (KMP应用)
- eclipse4.2(juno)各种插件安装(j2ee,m2e,maven-svn,svn,hibe
- 学习编程和网络需要的各种资源网址收集
- android开发 Activity包含Fragment切换背景黑色闪屏解决方案
- 更新与查询数据库
- 子串和
- HDU 1867 A + B for you again kmp算法
- 求Fibonacci数列,吸血鬼数,素数等实现
- 从指南针到动手搭建自己的第一台计算机
- 【机器学习】朴素贝叶斯分类器
- 简明python地址簿
- 水塘抽样(Reservoir Sampling)问题
- 每日一省之————字符串排序算法(包括低位优先、高位优先、三向快速排序)
- hdu3316 Mine sweeping--DFS
- android注解框架ButterKnife学习