被hack了、感觉好头疼、代码的逻辑还是不严谨、在此提醒自己、
import java.util.Scanner;
public class B {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int len = input.nextInt();
String s = input.next();
char [] c = s.toCharArray();
int maxAns = 0;
for(int j = 1; j < len; j++){
int ans = j + 1; // 记录比较字符串的长度、、 从2开始、(不然没有意义)
if(ans + j < len){
boolean flag = true;
for(int k = 0; k <= j; k++){
if(s.charAt(k) != s.charAt(ans + k)){
flag = false;
break;
}
}
if(flag){
maxAns = Math.max(ans, maxAns);
}
}else{
break;
}
}
if(maxAns == 0){
System.out.println(len);
}else{
System.out.println(len - maxAns * 2 + maxAns + 1); // 复制的代价、制造一条链、在复制(代价+1)
}
/* for (int i = 0; i <= len / 2; i++) { // hack 、、、
int tmp = 0;
for (int j = 0; j < i; j++) { // i的长度 、找出最长的、、
if (c[j] == c[j + i]) {
tmp++;
maxAns = Math.max(maxAns, tmp); // 找出最长的字符列、、
} else {
break;
}
}
} // 找到能复制的最大的一个了、、 (最大的重复自序列)
System.out.println(len - maxAns);*/
}
}
这道题目的思路是、(数据量很大、不能枚举)、所以我先通过两个相同的坐标来判断、因为只能相邻的移动、所以两个坐标相减,可能是上下移动(相差y)、也可能是左右移动(相差1)、所以先把y找出来、如果没有的话、就特判1
通过计算出来的y、来将x,y的坐标分解出来、如果x1 - x2 ,y1 - y2的绝对值相加为1 那就是相邻的移动、若有一个不符合就是不存在、上代码、
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class C {
static int MAXN = 1000000000; // 开这么大 才不会被卡住、、、
static int n;
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
in.nextToken();
n = (int) in.nval;
int[] a = new int[n]; // 输入存放的数组、、
for (int i = 0; i < n; i++) {
in.nextToken();
a[i] = (int) in.nval; // 输入数据、、
}
solve(a);
}
private static void solve(int[] arr) { // 输入传入的数组、、
int y = -1;
for(int i = 0; i < n - 1; i++){ // 这里 我需要找出 y 的大小来、、
if(Math.abs(arr[i] - arr[i + 1]) > 1){
if(y == -1){
y = Math.abs(arr[i] - arr[i + 1]);
}else if(y != Math.abs(arr[i] - arr[i + 1])){
out.println("NO");
out.flush();
return;
}
}
}
if(y == -1){ // 找不到的情况、 这个时候就只有 1 可能符合、、、
y = 1;
}
for(int i = 0; i < n - 1; i++){ // 判断是否是上下左右移动、、、(两个坐标只会相差 1)
int x1 = (arr[i] - 1) / y + 1;
int y1 = (arr[i] - 1) % y + 1;
int x2 = (arr[i + 1] - 1) / y + 1;
int y2 = (arr[i + 1] - 1) % y + 1;
int ans = Math.abs(x1 - x2) + Math.abs(y1 - y2);
if(ans != 1){
out.println("NO");
out.flush();
return;
}
}
out.println("YES");
out.println(MAXN + " " + y);
out.flush();
}
}