🍑 算法题解专栏
🍑 蓝桥 异或变换
输入
5 3
10110
输出
11010
🍑 思路
🍤 打表找周期(循环节)
🍤 避免使用 Math.pow 造成不同类型运算的精度问题
🍑 AC code
打表:周期为 >= n 的第一个 以 2 为底的幂
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long t = sc.nextLong();
String s = sc.next();
int[] a = new int[n + 2];
for (int i = 0; i < n; i++)
a[i] = s.charAt(i) - '0';
long cnt = 1;// 循环周期的长度
while (cnt < n)
{
cnt <<= 1;
}
t %= cnt;
while (t-- > 0)
{
for (int i = n - 1; i > 0; i--)
{
a[i] ^= a[i - 1];
}
}
for (int i = 0; i < n; i++)
System.out.print(a[i]);
}
}
🍑 纯暴力模拟(60%)
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int t = sc.nextInt();
String s = sc.next();
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = s.charAt(i) - '0';
while (t-- > 0)
{
for (int i = n - 1; i > 0; i--)
{
a[i] = a[i] ^ a[i - 1];
}
}
for (int i = 0; i < n; i++)
System.out.print(a[i]);
}
}