Проблема: http://usaco.org/index.php?page=viewproblem2&cpid=1012

Решение:

По сути, этот алгоритм просто принимает две входные строки как массивы символов и выполняет итерацию по ним обеим одновременно. Мы продолжаем использовать переменную (flip), чтобы отслеживать количество подстрок в двух массивах, которые не равны друг другу. Кроме того, мы также используем переменную (equal), чтобы отслеживать, эквивалентны ли текущие подстроки друг другу. Если текущие символы в одной и той же позиции не эквивалентны, мы устанавливаем equalfalse. Если символ сразу после него также не эквивалентен, equal по-прежнему будет ложным, поскольку они являются частью одной и той же подстроки. Мы увеличиваем flip, когда для equal снова устанавливается значение true, потому что это происходит только тогда, когда «неравная» подстрока заканчивается и текущие символы равны. Если мы перебираем массив, а equal по-прежнему имеет значение false, это означает, что в конце массивов есть подстрока/символ, которые не равны и не были добавлены в наш ответ, flip, поэтому мы пишем дополнительный оператор «if» вне нашего цикла for, чтобы учесть это.

import java.io.*;
import java.util.*;
public class MadScientist {
public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  Kattio io = new Kattio("breedflip");
  
  // Take in input
  int N = io.nextInt();
  char[] a = io.next().toCharArray();
  char[] b = io.next().toCharArray();
  
  // 'flip' is the variable that stores our answer
  int flip = 0;
  // 'equal' keeps track of whether or not the current character/substring of 'b' equals 'a'
  boolean equal = true;
  
  // iterate through both arrays simultaneously
  for (int i = 0; i < N; i++)
  {
   // if the current character of a does not equal the current character of 'b', we 
   // set 'equal' to false
   if (a[i] != b[i]) equal = false;
   
   // if the current character of 'a' equals the current character of 'b'
   // and 'equal' is false, then we increment 'flip' and reset 'equal' to true
   if (a[i] == b[i] && !equal) 
   {
    flip++;
    equal = true;
   }
  }
  
  // if we finish iterating through the array and 'equal' still has the value false,
  // then that means that the last substring of 'b' does not equal the corresponding portion of
  // 'a' so we do this if statement to account for that edge case since the arrays were traversed
  // through before we incremented flip again
  if (!equal) flip++;
  io.println(flip); // output answer
  
  
  io.close();
}
 static class Kattio extends PrintWriter {
  private BufferedReader r;
  private StringTokenizer st;
 
  // standard input
  public Kattio() { this(System.in, System.out); }
  public Kattio(InputStream i, OutputStream o) {
   super(o);
   r = new BufferedReader(new InputStreamReader(i));
  }
  // USACO-style file input
  public Kattio(String problemName) throws IOException {
   super(new FileWriter(problemName + ".out"));
   r = new BufferedReader(new FileReader(problemName + ".in"));
  }
 
  // returns null if no more input
  public String next() {
   try {
    while (st == null || !st.hasMoreTokens())
     st = new StringTokenizer(r.readLine());
    return st.nextToken();
   } catch (Exception e) { }
   return null;
  }
 
  public int nextInt() { return Integer.parseInt(next()); }
  public double nextDouble() { return Double.parseDouble(next()); }
  public long nextLong() { return Long.parseLong(next()); }
 }
}

Надеюсь, эта редакция помогла вам! Если это так, мы будем очень благодарны, если вы нажмете кнопку хлопка в этой статье. Если необходимы какие-либо разъяснения или у вас есть какие-либо предложения по улучшению, не стесняйтесь оставлять комментарии ниже.