HDU 1867(kmp应用)
时间:2022-07-28
本文章向大家介绍HDU 1867(kmp应用),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意描述
Generally speaking, there are a lot of problems about strings processing. Now you encounter another such problem. If you get two strings, such as “asdf” and “sdfg”, the result of the addition between them is “asdfg”, for “sdf” is the tail substring of “asdf” and the head substring of the “sdfg” . However, the result comes as “asdfghjk”, when you have to add “asdf” and “ghjk” and guarantee the shortest string first, then the minimum lexicographic second, the same rules for other additions.
思路
使用两次kmp,分别求出p匹配s和s匹配p的相同前后缀的个数,如果相同,则使用strcpy()来比较两个字符串的字典序大小,否则按照题意输出
AC代码
#include<bits/stdc++.h>
#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<long,long> PLL;
typedef pair<char,char> PCC;
typedef long long LL;
const int N=2*1e5+10;
const int M=150;
const int INF=0x3f3f3f3f;
const int MOD=998244353;
int n,m,ne[N];
char p[N],s[N];
void get_next(char* str){
int len=strlen(str);
int i=0,j=-1;
ne[0]=-1;
while(i<len){
if(j==-1 || str[i]==str[j]){
i++;
j++;
ne[i]=j;
}else{
j=ne[j];
}
}
}
int get_kmp(char* str1,char* str2){
int len1=strlen(str1);
int len2=strlen(str2);
get_next(str2);
int i=0,j=0;
while(i<len1){
if(j==-1 || str1[i]==str2[j]){
i++;
j++;
}else{
j=ne[j];
}
}
return j;
}
void solve(){
while(scanf("%s%s",s,p)!=EOF){
int k1=get_kmp(p,s);
int k2=get_kmp(s,p);
if(k1>k2){
printf("%s%s",p,s+k1);
}else if(k1<k2){
printf("%s%s",s,p+k2);
}else{
if(strcmp(s,p)>0) printf("%s%s",p,s+k2);
else if(strcmp(s,p)<0) printf("%s%s",s,p+k2);
else printf("%s",p);
}
puts("");
}
}
int main(){
//IOS;
solve();
return 0;
}
- 碎片化 | 第四阶段-35-Struts2-Spring结合jdbc实现查询列表-视频
- 碎片化 | 第四阶段-28-Struts2框架概述以及原理图解-视频
- nginx 负载均衡
- 机器学习算法应用中常用技巧-1
- 碎片化 | 第四阶段-29-Struts2入门示例1-视频
- nginx虚拟主机配置
- nginx rewrite
- 碎片化 | 第四阶段-30-Struts2入门示例流程梳理-视频
- 碎片化 | 第一阶段-01-基本常识-视频
- 你真的了解For循环吗?一道For循环Java面试题引发的思考
- 碎片化 | 第一阶段-02-Java的跨平台性-视频
- Pandas常用命令-2
- 碎片化 | 第一阶段-03-Java语言环境搭建-视频
- nginx反向代理实现跨域请求
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义View实现点赞控件
- Android自定义View实现投票进度条
- 国外Reservo一款非常棒的商业图床程序
- 详解Android v1、v2、v3签名(小结)
- Android Studio项目适配AndroidX(Android 9.0)的方法步骤
- Android自定义View实现微信语音界面
- Android仿微信录音功能(录音后的raw文件转mp3文件)
- Android基于腾讯云实时音视频仿微信视频通话最小化悬浮
- Android自定义View之RadioGroup实现跨多行显示
- Android RadioGroup多行显示效果 解决单选问题
- RadioGroup实现单选框的多行排列
- Android实现悬浮窗全系统版本
- Android基础控件RadioGroup使用方法详解
- Android采用消息推送实现类似微信视频接听
- Android BottomSheet实现可拉伸控件