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 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...
随机推荐
- Dotnet core使用JWT认证授权最佳实践(一)
最近,团队的小伙伴们在做项目时,需要用到JWT认证.遂根据自己的经验,整理成了这篇文章,用来帮助理清JWT认证的原理和代码编写操作. 一.JWT JSON Web Token (JWT)是一个开放标准 ...
- 热修复框架Tinker快速集成
由于腾讯官方的demo对于刚接触的我来说,太过复杂,找不到核心配置,因此将tinker集成中最核心的东西抽取出来,整合到一个demo中. demo工程已经提交到github上,点击跳转 更多使用方法, ...
- 永远不要使用双花括号初始化实例,否则就会OOM!
生活中的尴尬无处不在,有时候你只是想简单的装一把,但某些"老同志"总是在不经意之间,给你无情的一脚,踹得你简直无法呼吸. 但谁让咱年轻呢?吃亏要趁早,前路会更好. 喝了这口温热的鸡 ...
- PAT-1063 Set Similarity (set集合)
1063. Set Similarity Given two sets of integers, the similarity of the sets is defined to be Nc/Nt*1 ...
- thinkphp5.0 cache缓存机制
首先引用缓存文件 use think\Cache; public function index(){ $data = Cache::get('showw');//去缓存 if($data){ echo ...
- Python面向对象的特征跟私有属性
面向对象的三大特征 继成.封装.多态: 继承:一个类可以继承一个或多个类,被继承的类叫做父类,继承的类叫做子类 封装:将数据和方法放在了一个类中就构成了封装 多态:指的一类事物有多重形态,一个抽象类 ...
- ## 0521Day04内部类
[重点] Math公式 静态导入 正则表达式 内部类 访问修饰符 [Math] Math包的相关方法: round:四舍五入:-10.9==>-11/-11.2==>-11 floor:向 ...
- js中 addEventListener 和removeEventListener
js中添加事件监听本来是非常常见的事情,但是去除监听一般很少去干,最近项目中需要监听页面显示或者隐藏 代码如下 document.addEventListener(visibilitychange', ...
- 在线编写复杂的数学公式--EdrawMath
网址: EdrawMath , 非常好用
- 五、Spring Web应用程序构建
内容 映射请求到Spring控制器 透明地绑定表单参数 校验表单提交 关键词 模型-视图-控制器(Model-View-Controller,MVC) 处理器映射(handle mapping) 视图 ...