奇妙的算法【6】-WY回文、树、最优化、卷积判断
1,判断一个十进制正整数的二进制数是否为回文
package com.cnblogs.mufasa.answer1; import java.util.Scanner; public class Main {
public static void main(String[] args) {
//0,测试专用数据
// int[] nums={1,4,7}; //1,数据输入
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
int[] nums=new int[T];
for(int i=0;i<T;i++){
nums[i]=sc.nextInt();
} //2,输入数据验证
// printOut(nums);//验证正确 //3,正常处理数据
for(int temp:nums){
Judge(temp);
}
} //3,单个数据监测是否二进制是回文
public static void Judge(int temp){
String str="";
//3.1,数值转换
while (temp!=0){
str=temp%2+str;
temp=temp/2;
}
//3.2,数据判断
String out="YES";
int len=str.length();
for(int i=0;i<len/2;i++){
if(str.charAt(i)!=str.charAt(len-1-i)){
out="NO";
break;//提前跳出
}
}
//3.3,结论输出
System.out.println(out);
} //2,测试输入是否正确
public static void printOut(int[] nums){
for(int temp:nums){
System.out.println(temp);
}
}
} /*
输入样例:
3
1
4
7
输出样例:
YES
NO
YES
*/
2,构建二叉树,找出根节点,然后层次遍历判断
package com.cnblogs.mufasa.answer2; import java.util.Scanner;
import java.util.*; class Node{//节点辅助类
int value;
int left;
int right;
public Node(int value, int left, int right) {
this.value = value;
this.left = left;
this.right = right;
}
} public class Main {
public static void main(String[] args){ //1,数据输入
Scanner in = new Scanner(System.in);
while (in.hasNext()){
String line1=in.nextLine();
int T=Integer.valueOf(line1); List<Boolean> ret=new ArrayList<>();
for (int i=0;i<T;i++){
String line=in.nextLine();
int N=Integer.valueOf(line);
Node[] nodes = new Node[N]; for (int j=0;j<N;j++){
String[] nodeData=in.nextLine().split(" ");
nodes[j]=new Node(Integer.valueOf(nodeData[0]),
Integer.valueOf(nodeData[1]),
Integer.valueOf(nodeData[2]));
}
//2,数据处理
ret.add(judge(nodes));
}
//3,数据输出
for (Boolean bool:ret){
String s;
if (bool){
s="YES";
}else{
s="NO";
}
System.out.println(s);
}
}
} //2,数据处理
private static boolean judge(Node[] nodes){
int root=findRoot(nodes);
Stack<Integer> stack=new Stack<>();
int last=nodes[root].value;
stack.push(root);
while (!stack.isEmpty()){
int sum=0;
List<Integer> list=new ArrayList<>();
while (!stack.isEmpty()){
int index=stack.pop();
int left=nodes[index].left;
int right=nodes[index].right; if (left!=-1){
sum+=nodes[left].value;
list.add(left);
} if (right!=-1){
sum+=nodes[right].value;
list.add(right);
}
} if (last>=sum&&list.size()>0){
return false;
} last=sum;
for (int index:list){
stack.push(index);
}
}
return true;
} //寻找根节点
private static int findRoot(Node[] nodes){
int[] array=new int[nodes.length];
for (Node node:nodes){
if (node.left!=-1){
array[node.left]=1;
}
if (node.right!=-1){
array[node.right]=1;
}
} for (int i=0;i<array.length;i++){
if (array[i]<1){
return i;
}
}
return -1;
}
} /*
输入样例:
2
8
2 -1 -1
1 5 3
4 -1 6
2 -1 -1
3 0 2
2 4 7
7 -1 -1
2 -1 -1
8
21 6 -1
52 4 -1
80 0 3
31 7 -1
21 -1 -1
59 -1 -1
50 5 -1
48 -1 1 输出样例:
YES
NO
*/
3,如何在30个单位中插入最多的元素
package com.cnblogs.mufasa.answer3; import java.util.ArrayList;
import java.util.Scanner; public class Main {
public static void main(String[] args) { //1,数据输入
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
int[][] KM=new int[T][2];
ArrayList<ArrayList<Integer>> arr=new ArrayList<>(T);
for(int i=0;i<T;i++){
KM[i][0]=sc.nextInt();
KM[i][1]=sc.nextInt();
ArrayList<Integer> preArr=new ArrayList<Integer>(KM[i][1]);
arr.add(preArr);
for(int j=0;j<KM[i][1];j++){
preArr.add(sc.nextInt());
}
} //2,输入数据验证
// printOut(arr); //3,数据处理
for(int i=0;i<T;i++){
ArrayList<Integer> preArr=arr.get(i);
dealSum(KM[i][0],KM[i][1],preArr);
} } //3.1,数据处理 全局处理
public static void dealSum(int k,int m,ArrayList<Integer> preArr){
int ans=0;
if(m==0){//3.1,没有固定的天数【正确】
ans=dealSingle(k,1,30);
}else if(preArr.get(0)==1){//3.2,有固定天数,第一天为1【正确】
ans=m;
for(int i=1;i<preArr.size();i++){
ans=ans+dealSingle(k,preArr.get(i-1)+k+1,preArr.get(i)-k-1);
}
ans=ans+dealSingle(k,preArr.get(m-1)+k+1,30);
}else {//3.3,有固定的天数,第一天不为1【正确】
ans=m;
ans=ans+dealSingle(k,1,preArr.get(0)-k-1);
for(int i=1;i<preArr.size();i++){
ans=ans+dealSingle(k,preArr.get(i-1)+k+1,preArr.get(i)-k-1);
}
ans=ans+dealSingle(k,preArr.get(m-1)+k+1,30);
}
System.out.println(ans);
} //3.2,数据处理 单个区间处理
public static int dealSingle(int k,int index0,int index1){//index0可以,index1可以
if(index1<index0){//非法输入无法进行日期选定
return 0;
}else if(index1-index0<k&&index1>=index0){//不够展开,只能在其中任选一天
return 1;
}
int cont=1;//可以展开,可以进行最大化日期选择
int index=index0;
while (index<=index1-k-1){
cont++;
index+=k+1;
}
// System.out.println("cont:"+cont);
return cont;
} //2,输入数据验证【验证正确】
public static void printOut(ArrayList<ArrayList<Integer>> arr){
for(int i=0;i<arr.size();i++){
ArrayList<Integer> preArr=arr.get(i);
for(int j=0;j<preArr.size();j++){
System.out.print(preArr.get(j)+"-");
}
System.out.println();
}
}
}
/**
* 1,只有间隔
*/ /*
1
1 0 1
5 0 输入样例:
4
0 10
1 2 3 4 5 6 7 8 9 10
1 15
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29
1 7
5 9 13 17 21 25 29
1 0 输出样例:
30
15
15
15 */
4,获取最大的合法框图的坐标点【reture无法跳出循环】
package com.cnblogs.mufasa.myWorkStation; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner; public class Main4 {
private static boolean[] flags=new boolean[9];//true表示1,false表示0
static {
flags[0]=true;
flags[2]=true;
flags[6]=true;
flags[8]=true;
for(int i=0;i<9;i++){
flags[i]=!flags[i];
}
} public static void main(String[] args) {
ArrayList<int[][]> cacheArr=new ArrayList<>();
Scanner in=new Scanner(System.in);
while (in.hasNext()) {
String line1 = in.nextLine();
int t = Integer.valueOf(line1);
for (int i = 0; i < t; i++) {
String[] nm = in.nextLine().split(" ");
int n = Integer.valueOf(nm[0]);
int m = Integer.valueOf(nm[1]);
int[][] arr = new int[n][m];
for (int j = 0; j < n; j++) {
String newLine = in.nextLine();
for (int k = 0; k < m; k++) {
arr[j][k] = newLine.charAt(k) - '';
}
}
cacheArr.add(arr);
//3,数据验证
// for (int[] a : arr) {
// System.out.println(Arrays.toString(a));
// }
}//一组数据输入完成 for(int i=0;i<cacheArr.size();i++){
int[][] arr=cacheArr.get(i);
int n=arr.length,m=arr[0].length;
//2,数据处理
dealSum(cacheArr.get(i),n,m);
}
} } //2.1,数据处理函数 sum 全局搜索:由大到小的搜索是否存在
public static void dealSum(int[][] arr,int N,int M){
int MIN=(N<M?N:M);
String strPre="-1 -1 -1 -1";
String strOut;
while (MIN>=3){
if (MIN%3==0){//刚好可以成为一个9宫格
strOut=dealSingle(arr,N,M, MIN);
if(strOut!=strPre){
strPre=strOut;
break;
}
}
MIN--;
}
System.out.println(strPre);
} //2.2,数据处理 single 固定9宫格的大小,在arr中搜索是否存在
public static String dealSingle(int[][] arr,int N,int M,int MIN){
int minLen=MIN/3;
String outStr="-1 -1 -1 -1";
loop:for(int i=0;i<N-MIN+1;i++){
for(int j=0;j<M-MIN+1;j++){
boolean sinFlag=dealMin(arr, MIN, minLen, i, j);
// System.out.println((i+1)+" "+(j+1)+" "+ (i+MIN)+" "+(j+MIN)+":"+sinFlag);
if(sinFlag==true){
// System.out.println("数据处理----------");
outStr=((i+1)+" "+(j+1)+" "+ (i+MIN)+" "+(j+MIN));
// System.out.println(outStr);
// System.out.println("数据处理----------");
return outStr;
// break loop;
}
}
}
return outStr;
} //2.3,数据处理 min 固定9宫格,固定index位置,判断是否可以
public static boolean dealMin(int[][] arr,int MIN,int minLen,int index0,int index1){
for(int num=0;num<9;num++){
boolean minFlag=dealSqure(arr,minLen,index0+num/3*minLen,index1+num%3*minLen,flags[num]);
if(!minFlag){
return false;
}
}
return true;
} //2.4,数据处理 squre 方块中是否全为1或者0
public static boolean dealSqure(int[][] arr,int minLen,int index0,int index1,boolean type){
int mark=(type?1:0);
for(int i=index0;i<index0+minLen;i++) {
for (int j = index1; j < index1+minLen; j++) {
if(arr[i][j]!=mark){
return false;
}
}
}
return true;
}
} /*
输入样例:
3
3 3
111
000
111
6 6
010010
111111
010010
010010
111111
010010
8 8
01000001
11100001
01001100
11001100
00111111
00111111
00001100
11001100 输出样例:
-1 -1 -1 -1
1 1 3 3
3 3 8 8
*/
奇妙的算法【6】-WY回文、树、最优化、卷积判断的更多相关文章
- 省选算法学习-回文自动机 && 回文树
前置知识 首先你得会manacher,并理解manacher为什么是对的(不用理解为什么它是$O(n)$,这个大概记住就好了,不过理解了更方便做$PAM$的题) 什么是回文自动机? 回文自动机(Pal ...
- 【CF932G】Palindrome Partition(回文树,动态规划)
[CF932G]Palindrome Partition(回文树,动态规划) 题面 CF 翻译: 给定一个串,把串分为偶数段 假设分为了\(s1,s2,s3....sk\) 求,满足\(s_1=s_k ...
- HDU.5394.Trie in Tina Town(回文树)
题目链接 \(Description\) 给定一棵\(Trie\).求\(Trie\)上所有回文串 长度乘以出现次数 的和.这里的回文串只能是从上到下的一条链. 节点数\(n\leq 2\times ...
- Palindromic Tree 回文自动机-回文树 例题+讲解
回文树,也叫回文自动机,是2014年被西伯利亚民族发明的,其功能如下: 1.求前缀字符串中的本质不同的回文串种类 2.求每个本质不同回文串的个数 3.以下标i为结尾的回文串个数/种类 4.每个本质不同 ...
- HDU3948 & 回文树模板
Description: 求本质不同回文子串的个数 Solution: 回文树模板,学一学贴一贴啊... Code: /*================================= # Cre ...
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest G The Problem to Slow Down You 回文树
The Problem to Slow Down You Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjud ...
- 【CF245H】Queries for Number of Palindromes(回文树)
[CF245H]Queries for Number of Palindromes(回文树) 题面 洛谷 题解 回文树,很类似原来一道后缀自动机的题目 后缀自动机那道题 看到\(n\)的范围很小,但是 ...
- 【CF17E】Palisection(回文树)
[CF17E]Palisection(回文树) 题面 洛谷 题解 题意: 求有重叠部分的回文子串对的数量 所谓正难则反 求出所有不重叠的即可 求出以一个位置结束的回文串的数量 和以一个位置为开始的回文 ...
- 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)
[SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. ...
- 【BZOJ2160】拉拉队排练(回文树)
[BZOJ2160]拉拉队排练(回文树) 题面 BZOJ 题解 看着题目, 直接构建回文树 求出每个回文串的出现次数 直接按照长度\(sort\)一下就行了 然后快速幂算一下答案就出来了 这题貌似可以 ...
随机推荐
- Linux中touch命令使用(创建文件)
touch命令有两个功能: 1.用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来: 2.用来创建新的空文件. 语法 touch(选项)(参数) 选项 -a:或 ...
- python 设计模式之访问者模式
写在前面 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情形下实现 ...
- React——相关工具概述
Create a New React App Use an integrated toolchain for the best user and developer experience. This ...
- Jrebel激活方法
参考 https://www.yanjiayu.cn/posts/3eecb801.html https://gitee.com/gsls200808/JrebelLicenseServerforJa ...
- AWS 云上安全最佳实践
目录 一.账号及访问管理 1.1.多 VPC 还是多账号模式 1.2.多账户模式,选择主 master 账号 二.系统架构安全 2.1.子网建议 2.2.每个可用区子网划分 2.3.安全组的建议 2. ...
- 对图片清晰度问题,纠结了一晚上。清理了下Libray,瞬间变清晰了,泪奔
对图片清晰度问题,纠结了一晚上.清理了下Libray,瞬间变清晰了,泪奔
- 成为java架构师的技能
0: 数据结构算法 数组.链表.堆.栈.队列.Hash表.二叉树等; 算法思想:递推.递归.穷举.贪心.分治.动态规划.迭代.分枝界限; 排序查找 B+/B-数.红黑树.图等; 图的深度优先搜索.图的 ...
- php utf8 gbk 数组 互转
这些都是工作中常用的 前几年写过 但没有记录的习惯,后边有要用到麻烦,现在记录下 以后直接拿来用 数组里的 utf8_to_gbk 方法 是上一篇写的 直接调用 public static funct ...
- 最新 荔枝java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.荔枝等10家互联网公司的校招Offer,因为某些自身原因最终选择了荔枝.6.7月主要是做系统复习.项目复盘.LeetCode ...
- sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 的解决办法
Linux新建用户 ,sudo报错: sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set 解决办法:重置一下s ...