java实现第六届蓝桥杯切开字符串
切开字符串
Pear有一个字符串,不过他希望把它切成两段。
这是一个长度为N(<=10^5)的字符串。
Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两段都必须非空)。
Pear用如下方式评估切割的方案:
定义“正回文子串”为:长度为奇数的回文子串。
设切成的两段字符串中,前一段中有A个不相同的正回文子串,后一段中有B个不相同的非正回文子串,则该方案的得分为A*B。
注意,后一段中的B表示的是:“…非正回文…”,而不是: “…正回文…”。
那么所有的切割方案中,A*B的最大值是多少呢?
【输入数据】
输入第一行一个正整数N(<=10^5)
接下来一行一个字符串,长度为N。该字符串仅包含小写英文字母。
【输出数据】
一行一个正整数,表示所求的A*B的最大值。
【样例输入】
10
bbaaabcaba
【样例输出】
38
【数据范围】
对于20%的数据,N<=100
对于40%的数据,N<=1000
对于100%的数据,N<=10^5
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
以下代码对于N大于10000可能会超时,代码仅供参考。
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static String A, S;
public int Manacher(String M, String N) {
int count = 0; //统计字符串M中不同正回文串个数
int[] P = new int[M.length()];
int mx = 0, id = 0;
for(int i = 1;i < M.length();i++) {
if(mx > i)
P[i] = Math.min(P[2 * id - i], mx - i);
else
P[i] = 1;
while(i+P[i] < M.length() && i-P[i] >= 0 &&
M.charAt(i+P[i]) == M.charAt(i-P[i]))
P[i]++;
if(P[i] + i > mx) {
mx = i + P[i];
id = i;
}
}
HashSet<String> set = new HashSet<String>();
for(int i = 2;i < P.length;i = i + 2) {
int len = P[i] - 1;
int j = i / 2 - 1; //回文串中心字符在字符串N中的位置
if(len == 0) {
String s = N.substring(j, j + 1);
if(!set.contains(s)) {
set.add(s);
count++;
}
} else if(len % 2 == 1){
for(int k = 0;k <= len / 2;k++) {
String s = N.substring(j - k, j + k + 1);
if(!set.contains(s)) {
set.add(s);
count++;
}
}
}
}
return count;
}
public int getAllChildern(String M) {
int count = 0; //统计字符串M所有不同子串个数
HashSet<String> set = new HashSet<String>();
for(int i = 0, len = 1;i < M.length();i++, len++) {
for(int j = 0;j <= M.length() - len;j++) {
String s = M.substring(j, j + len);
if(!set.contains(s)) {
set.add(s);
count++;
}
}
}
return count;
}
public void getResult() {
int max = -1;
for(int i = 1;i < A.length() - 1;i++) {
String s1 = S.substring(0, i * 2 + 1);
String s2 = "$" + S.substring(i * 2 + 1);
String s3 = A.substring(0, i);
String s4 = A.substring(i);
int a = Manacher(s1, s3);
int b = getAllChildern(s4) - Manacher(s2, s4);
max = Math.max(max, a * b);
}
System.out.println(max);
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
A = in.next();
StringBuilder s1 = new StringBuilder("$#");
for(int i = 0;i < A.length();i++) {
s1.append(A.charAt(i));
s1.append("#");
}
S = s1.toString();
test.getResult();
}
}
PS:纯暴力
package 第七次模拟;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Demo8切开字符串 {
static int n;
static String str = new String();
static int max = 0;
static int A, B, C;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
str = in.next();
for (int t = 1; t < n-1; t++) {
A = panduan(str.substring(0, t));
B = quan(str.substring(t, n)) - panduan(str.substring(t, n));
if (max < A*B) {
max = A*B;
}
}
System.out.println(max);
}
/**
* B的要求是找出 不相同的非正回文子串 这里采用曲线救国的方案,求出B的 全部不相同子串 的个数,减去B中 不相同的正回文子串 的个数
*
* */
private static int quan(String sub) {
// TODO Auto-generated method stub
Set<String> set = new HashSet<String>();
for (int i = 1; i <= sub.length(); i++) {
for (int start = 0; start <= sub.length()-i; start++) {
String s = sub.substring(start, start+i);
set.add(s);
}
}
return set.size();
}
/**
* 对于一个字符串,查找其中包含的正回文串个数
* */
private static int panduan(String sub) {
// TODO Auto-generated method stub
Set<String> set = new HashSet<String>();
set.clear();
for (int i = 1; i <= sub.length(); i+=2) {
for (int start = 0; start <= sub.length()-i; start++) {
String s = sub.substring(start, start+i);
if (huiwen(s) == true) {
set.add(s);
}
}
}
return set.size();
}
/**
* 判断回文
* */
private static boolean huiwen(String s) {
// TODO Auto-generated method stub
for (int i = 0; i < s.length()/2; i++) {
if (s.charAt(i) == s.charAt(s.length()-1-i)) {
continue;
} else {
return false;
}
}
return true;
}
}
java实现第六届蓝桥杯切开字符串的更多相关文章
- java实现第六届蓝桥杯居民集会
居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di. 每年,蓝桥村都要举行一次集会.今年,由于村里的人口太多 ...
- java实现第六届蓝桥杯四阶幻方
四阶幻方 把1~16的数字填入4x4的方格中,使得行.列以 及两个对角线的和都相等,满足这样的特征时称 为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1 ,请计算一共有多少种方案. 比如: ...
- java实现第六届蓝桥杯表格计算
表格计算 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可以是一 ...
- java实现第六届蓝桥杯穿越雷区
穿越雷区 题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能 ...
- java实现第六届蓝桥杯密文搜索
密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...
- java实现第六届蓝桥杯奇怪的数列
奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 - YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行& ...
- java实现第六届蓝桥杯奇妙的数字
奇妙的数字 奇妙的数字 小明发现了一个奇妙的数字.它的平方和立方正好把0~9的10个数字每个用且只用了一次. 你能猜出这个数字是多少吗? 请填写该数字,不要填写任何多余的内容. 结果:69 impor ...
- java实现第六届蓝桥杯循环节长度
循环节长度 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153..... 其循环节为[846153] 共有6位. 下面的方法,可以 ...
- java实现第六届蓝桥杯垒骰子
垒骰子 题目描述 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...
随机推荐
- 基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查
上一篇文章(https://www.cnblogs.com/meowv/p/12913676.html)我们用Code-First的方式创建了博客所需的实体类,生成了数据库表,完成了对EF Core的 ...
- mysql小白系列_09 mysql性能优化关键点
一 服务器参数调优,有哪些关键点? 1. 应用访问优化 优化方法 性能提升效果 优化成本 说明 减少数据访问能不访问就不访问-减少磁盘IO 1~1000 低 缓存服务器缓存mysql数据,Redis. ...
- mysql运维入门6:MySQL读写分离
Amoeba 以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy 集中想用应用的请求,根据用户事先设置的规则,将SQL请求发送到特定的数据库上执行 基于此可以实现负载均衡.读写分离 ...
- Hyperledger Fabric——balance transfer(二)注册用户
详细分析blance transfer示例的用户注册(register)与登录(enroll)功能. 源码分析 1.首先分析项目根目录的app.js文件中关于用户注册和登录的路由函数.注意这里的tok ...
- C语言基础知识(四)——位操作
一.进制基础知识 1.通常,1字节(Byte)包含8位(bit).C语言用字节表示储存系统字符集所需的大小. 2.对于一个1字节8位的二进制数,最右边(第0位)是最低阶位,最左边(第1位)是最高阶位, ...
- [PHP]用PHP自己写一个基于zoomeye的api(偷懒必备quq)
0x01 起因 因为手速慢,漏洞刷不过别人,一个个手补确实慢,所以想自己写一个api,一键抓取zoomeye的20页,然后就可以打批量了 ovo(真是太妙了!) 0x02 动工 1.抓包做 ...
- 学习ASP.NET Core(08)-过滤搜索与分页排序
上一篇我们介绍了AOP的基本概览,并使用动态代理的方式添加了服务日志:本章我们将介绍过滤与搜索.分页与排序并添加对应的功能 注:本章内容大多是基于solenovex的使用 ASP.NET Core 3 ...
- Java——多线程基础知识
多线程进程和线程的区别:每一个进程拥有自己的一整套变量,而线程则共享数据.java.lang.Thread static void sleep(long millis) 线程休眠给定的毫秒数,用 ...
- 如何在Teamcenter中使用PMI?
1 .什么是PMI 在设计制造领域,PMI指的是产品制造信息(Productand Manufacturing Information),其目的在于在三维环境下,将制造信息从设计部门传递到制造部门.其 ...
- SimpleAuthenticationInfo的参数
SimpleAuthenticationInfo的参数 仅供个人参考,以及学习记录.SimpleAuthenticationInfo authenticationInfo = new SimpleAu ...