Justice String

Time Limit: 2000ms
Memory Limit: 65536KB

64-bit integer IO format: %lld      Java class name: Main

 

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

The first line of the input contains a single integer T, which is the number of test cases.
For each test case, the first line is string A, and the second is string B.
Both string A and B contain lowercase English letters from a to z only. And the length of these two strings is between 1 and 100000, inclusive. 
 
 

Output

For each case, first output the case number as "Case #x: ", and x is the case number. Then output a number indicating the start position of substring C in A, position is counted from 0. If there is no such substring C, output -1.
And if there are multiple solutions, output the smallest one. 
 

Sample Input

3
aaabcd
abee
aaaaaa
aaaaa
aaaaaa
aabbb

Sample Output

Case #1: 2
Case #2: 0
Case #3: -1

Source

 
解题:Hash+二分
 
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = ;
char sa[maxn],sb[maxn];
unsigned LL Ha[maxn],Hb[maxn],p = ;
int len1,len2;
unsigned LL pp[maxn];
int calc(int a,int b){
int high = min(len1 - a,len2 - b),low = ,mid,ans = ;
while(low <= high){
mid = (low + high)>>;
unsigned LL v1 = Ha[a] - Ha[a+mid]*pp[mid];
unsigned LL v2 = Hb[b] - Hb[b+mid]*pp[mid];
if(v1 == v2){
ans = mid;
low = mid + ;
}else high = mid - ;
}
return ans;
}
int main() {
int T,cs = ;
pp[] = ;
for(int i = ; i < maxn; ++i) pp[i] = pp[i-]*p;
scanf("%d",&T);
while(T--){
scanf("%s %s",sa,sb);
len1 = strlen(sa);
len2 = strlen(sb);
Ha[len1] = ;
Hb[len2] = ;
for(int i = len1-; i >= ; --i) Ha[i] = Ha[i+]*p + sa[i];
for(int i = len2-; i >= ; --i) Hb[i] = Hb[i+]*p + sb[i];
int ans = -;
for(int i = ; i <= len1 - len2; ++i){
int sum = ,a = i,b = ,tmp = ;
tmp = calc(a,b);
if(tmp >= len2-){
ans = i;
break;
}
sum += tmp;
a += tmp+;
b += tmp+;
tmp = calc(a,b);
sum += tmp;
if(sum >= len2-){
ans = i;
break;
}
a += tmp+;
b += tmp+;
tmp = calc(a,b);
sum += tmp;
if(sum >= len2-){
ans = i;
break;
}
}
printf("Case #%d: %d\n",cs++,ans);
}
return ;
}

BNUOJ 34990 Justice String的更多相关文章

  1. BNU 34990 Justice String 2014 ACM-ICPC Beijing Invitational Programming Contest

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34990 DEBUG了非常久,还是legal的推断函数写错了... 此题做法.枚举Stri ...

  2. BNU 34990 Justice String (hash+二分求LCP)

    思路:枚举第一个字符串的位置,然后枚举最长公共前缀的长度,时间即会下降-- #pragma comment(linker, "/STACK:1024000000,1024000000&quo ...

  3. bnuoj 34990(后缀数组 或 hash+二分)

    后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...

  4. hihocoder 1084 扩展KMP && 2014 北京邀请赛 Justice String

    hihocoder 1084 : http://hihocoder.com/problemset/problem/1084 北京邀请赛 Just  String http://www.bnuoj.co ...

  5. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  6. BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的 ...

  7. BNUOJ34990--Justice String (exkmp求最长公共前缀)

    Justice String Given two strings A and B, your task is to find a substring of A called justice strin ...

  8. bunoj 34990(hash)

    传送门:Justice String 题意:有两个串A,B,问是否存在A的一个子串S,S和B的长度相等,最多有2个字符不同.如果有多个,输出其实下标最小S的下标,没有输出-1. 分析:从A每个位置开始 ...

  9. 2014 ACM/ICPC 北京邀请赛 部分 题解

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem.php?search=2014+ACM-ICPC+Beijing+Invitational+Programming+C ...

随机推荐

  1. IOS - ImagePicker 连拍

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)sel ...

  2. hdu5791 TWO

    hdu5791 TWO 题意 给你两个数串 问你两个数串有多少子串一致 子串不一定是连续的 解法 我们设 \(dp[i][j]\) 表示A串匹配到 i 位,B串匹配到 j 位,一致的子串数.那么我们有 ...

  3. Java String 字符串截取和获取文件的上级目录

    public String test() { String root = ServletActionContext.getServletContext().getRealPath("/&qu ...

  4. MATLAB解析PFM格式图像

    http://www.p-chao.com/ja/2016-09-27/matlab%E8%A7%A3%E6%9E%90pfm%E6%A0%BC%E5%BC%8F%E5%9B%BE%E5%83%8F/ ...

  5. python基础知识部分练习大全

    python基础知识部分练习大全   1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py   #必须在首行 ...

  6. springboot项目封装为docker镜像

    1.本次镜像的基础镜像是:https://www.cnblogs.com/JoeyWong/p/9173265.html 2.将打包好的项目文件放在与Dockerfile同级的目录下 3.Docker ...

  7. Null值操作

      1)NULL值写入的操作    create table j010(     id number(7),     name varchar2(20),     salary number(7,2) ...

  8. UVALive 3231 Fair Share

    Fair Share Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origina ...

  9. WinServer-服务器管理器-从入门到放弃

    WIN7 远程服务器管理工具 看看这篇帖子,他们说可以在WIN7上通过服务器管理工具来管理服务器上的软件 https://social.technet.microsoft.com/Forums/zh- ...

  10. Ruby print

    Ruby print