BNUOJ34990--Justice String (exkmp求最长公共前缀)
Justice String
Given two strings A and B, your task is to find a substring of A called justice string, which has the same length as B, and only has at most two characters different from B.
Input
Output
Sample Input
3
aaabcd
abee
aaaaaa
aaaaa
aaaaaa
aabbb
Sample Output
Case #1: 2
Case #2: 0
Case #3: -1 题意:两个字符串, 求B在在A串出现的第一个位置, 可以允许最多两个字符不同。
做法: 依次枚举位置i, 然后求A[i, ...lena - 1]与B的最长公共前缀, 再求 A[i, i+lenb-1]的B的最长公共后缀。。 然后对于中间那一部分, 用多项式hash直接判断是否相等。
#include <bits/stdc++.h>
using namespace std;
const int seed = 1e9+;
const int MAXN = 1e5+;
typedef unsigned long long uLL;
uLL _hash[][MAXN];
string s1, s2;
void Hash(string s, int d){
int len = s.size();
memset(_hash[d], , sizeof (_hash[d]));
for (int i = ; i < len; i++){
_hash[d][i] = (i ? _hash[d][i-] : ) * seed + s[i] - '';
}
}
void pre_kmp(string &s, int m, int next[]){
next[] = m;
int j = ;
while (j + < m && s[j] == s[j+]){
j++;
}
next[] = j;
int k = ;
for (int i = ; i < m; i++){
int p = next[k] + k - ;
int L = next[i-k];
if (i + L < p + ){
next[i] = L;
}else{
j = max(, p-i+);
while (i+j < m && s[i+j] == s[j]){
j++;
}
next[i] = j;
k = i;
}
}
}
void exkmp(string &str1, int len1, string &str2, int len2, int next[], int extend[]){
pre_kmp(str1, len1, next);
int j = ;
while (j < len2 && j < len1 && str1[j] == str2[j]){
j++;
}
extend[] = j;
int k = ;
for (int i = ; i < len2; i++){
int p = extend[k] + k - ;
int L = next[i-k];
if (i + L < p + ){
extend[i] = L;
}else{
j = max(, p-i+); while (i+j < len2 && j < len1 && str2[i+j] == str1[j]){
j++;
}
extend[i] = j;
k = i;
}
}
}
int ex1[MAXN], ex2[MAXN], next[MAXN];
uLL bas[MAXN];
void pre_solve(){
bas[] = ;
for (int i = ; i < MAXN; i++){
bas[i] = bas[i-] * seed;
}
}
int main(){ //freopen("in.txt", "r", stdin);
pre_solve();
int T, cas = ;
scanf ("%d", &T);
while (T--){
cin >> s1 >> s2;
int len1 = s1.size();
int len2 = s2.size();
Hash(s1, );
Hash(s2, );
string tmp1 = s1;
string tmp2 = s2;
reverse(tmp1.begin(), tmp1.end());
reverse(tmp2.begin(), tmp2.end());
exkmp(s2, len2, s1, len1, next, ex1);
exkmp(tmp2, len2, tmp1, len1, next, ex2);
int ans = -;
for (int i = ; i < len1; i++){
int t1 = ex1[i];
int t2 = ex2[len1 - i - len2];
int L1 = i+t1, R1 = i+len2-t2-;
int L2 = t1, R2 = len2-t2-;
bool ok1 = ((t1 == len2) || (R1 <= L1+)); uLL p1 = (_hash[][R1-] - _hash[][L1] * bas[R1--L1]);
uLL p2 = (_hash[][R2-] - _hash[][L2] * bas[R2--L2]);
bool ok2 = (p1 == p2);
if (ok1 || ok2){
ans = i;
break;
}
}
printf("Case #%d: %d\n", cas++, ans);
}
return ;
}
BNUOJ34990--Justice String (exkmp求最长公共前缀)的更多相关文章
- 求最长公共前缀和后缀—基于KMP的next数组
KMP算法最主要的就是计算next[]算法,但是我们知道next[]求的是当前字符串之前的子字符串的最大前后缀数,但是有的时候我们需要比较字符串中前后缀最大数,比如 LeetCode的shortest ...
- leetcode 14 最长公共前缀
描述: 给个字符串vector,求最长公共前缀. 解决: 直接取第一个字符串作为最长公共前缀,将其每个字符遍历过一次.设最长字符实际为k,共n个元素,则复杂度O(nk) string longestC ...
- LeetCode 14 Longest Common Prefix(最长公共前缀)
题目链接:https://leetcode.com/problems/longest-common-prefix/?tab=Description Problem: 找出给定的string数组中最 ...
- HDU 4681 string 求最长公共子序列的简单DP+暴力枚举
先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍. 再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束 将这些起始位 ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- hdoj 2594 Simpsons’ Hidden Talents 【KMP】【求串的最长公共前缀后缀】
Simpsons' Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】
算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...
- HDU 1243 反恐训练营 (动态规划求最长公共子序列)
反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- POJ 3080 Blue Jeans (求最长公共字符串)
POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...
随机推荐
- 精益创业之父Steve Blank: 怎样让企业内部创新获得50倍增速
编者注:本文英文版来自创新大师Steve Blank的个人博客,中文版由天地会珠海分舵进行编译.应用在初创企业打造上面的精益创业相信我们已经耳熟能详,可是假设我们面对的是一个已经发展起来的企业.或者是 ...
- 纯CSS3实现超立体的3D图片侧翻倾斜效果
看到网友分享的一款CSS3 3D图片侧翻倾斜特效,觉得效果非常棒,其实话说回来,这玩意儿的实现真的非常简单,主要是创意不错.先来看看效果图.那么接下来我们分析一下源码吧,显示html代码,非常简单: ...
- Java基础知识强化70:正则表达式之引入案例(QQ号码校验)
1. 校验QQ号码的案例,如下: package cn.itcast_01; import java.util.Scanner; /* * 校验qq号码. * 1:要求必须是5-15位数字 * 2:0 ...
- 复杂 Listview 显示 多个样式
三种方式 目前为止有三种方法让Listview现实多个样式 最简单最常用的,通过addHeaderView或addFooterView,但是只能在首尾添加 较麻烦但正规的方式,通过getViewTyp ...
- sqlserver中的统计语法
set statisitcs io {on | off} 显示与执行的sql语句有关的磁盘活动量的信息 set statistics profile {on | off} 显示语句的配置文件信息 se ...
- Java sql helper[转]
原文:http://www.cnblogs.com/beijiguangyong/archive/2011/12/10/2302737.html package sql; import java.sq ...
- 最全的ORACLE-SQL笔记
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unloc ...
- 传输层-UDP
传输层构建在网络层之上,传输层提供端口到端口之间的通讯. 传输层通过端口号来标识一个端口,不同于网卡,端口是逻辑上的概念.传输层的端口为16个比特(bit)长度,即最多能表示65 536个端口,端口号 ...
- JavaScript 客户端JavaScript之cookie和客户端持久性
Document对象都有一个cookie属性,它使得JavaScript代码能够在用户的硬盘上持久地存储数据, 并且能够获取以这种方式存储的数据.客户端持久性是赋予WEB应用程序记忆力的一种简单方法. ...
- strcmp和==比较
本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/cpp_strcmp.html #include <stdio.h> # ...