아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

회문의 역습

시간 제한2초메모리 제한1024 MB

요약
각 위치 i에 대해 i를 포함하면서 회문이 되는 위치 부분집합의 수를 세고, i와 그 수를 곱한 값을 10^9+7로 나눈 뒤 모두 XOR한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 조합론, 문자열, 수학
정답자
아직 제출이 없습니다

문제

회문(palindrome)은 프로그래밍 대회에서 오랫동안 반복되어 온 소재이지만, 회문과 관련된 문제는 대체로 꽤 쉬운 편이었고, 그래서 회문들은 자신들이 홀대받는다고 느꼈다. 그리하여 회문 세계 총회에서는 회문들의 힘을 하나로 모아 경쟁 프로그래머들에게 본때를 보여 주기로 결정하였다.

회문은 교활해서 문자열 속에 자주 숨는다. 어떤 문자열에서 일부 문자를 지웠을 때 남은 문자들이 회문을 이루면, 그 회문이 문자열 속에 숨어 있었다고 말한다. 예를 들어 문자열 banaan 속에는 회문 aaa, naan, nan, b 등이 숨어 있다.

문자열의 각 문자에는 회문력(palindromic power)이 있다. 이 힘은 그 문자의 위치 번호(11부터 센다)와, 그 문자에 숨어 있는 회문의 개수를 곱한 값이다. 여기서 지우는 방법이 서로 다르다는 것은 남긴 위치들의 집합이 다르다는 뜻이며, 남은 문자열이 같더라도 위치 집합이 다르면 서로 다른 경우로 센다. 즉 서로 다른 문자열이 아니라 위치들의 부분집합을 센다.

예를 들어 문자열 aaba의 네 문자의 회문력은 각각 1⋅5=51 \cdot 5 = 5, 2⋅5=102 \cdot 5 = 10, 3⋅3=93 \cdot 3 = 9, 4⋅6=244 \cdot 6 = 24이다. 첫 번째 문자의 회문력이 55인 이유는 다음과 같다. 다른 문자들을 여러 조합으로 지우면 첫 번째 문자를 포함하는 경우가 88가지 나오고, 그중 55가지가 회문이다(별표로 표시). 점(.)은 지워진 문자를 뜻한다: a...*, a..a*, a.b., a.ba*, aa..*, aa.a*, aab., aaba.

회문들이 "힘을 하나로 모은다"는 것은 자신들의 비트를 모두 합쳐 아주 강해진다는 뜻이었다. 하지만 회문들은 두 가지를 미처 고려하지 못했다.

첫째, 그들의 힘은 마법 모듈러라는 프로그래밍 대회의 자연법칙에 의해 제한된다. 모두가 알듯이 마법 모듈러의 값은 109+710^9 + 7이다. 각 위치의 회문력을 구할 때에는 그 곱을 마법 모듈러로 나눈 나머지를 취해야 한다.

둘째, 힘의 비트들은 서로 상쇄되기 때문에, 이들을 합치면 힘의 합이 아니라 비트 단위 XOR(⊕\oplus) 연산의 결과가 된다. 문자열의 모든 문자의 회문력을 XOR한 결과를 그 문자열의 회문력이라고 부른다.

입력

첫째 줄에 문자열의 길이 NN (1≤N≤30001 \le N \le 3000)이 주어진다. 둘째 줄에 NN개의 소문자 라틴 문자(a–z)로 이루어진 문자열이 주어진다.

출력

주어진 문자열의 회문력을 한 줄에 출력한다.

예제4

  1. 예제 1

    입력
    4
    aaba
    
    예상 출력
    30
    
  2. 예제 2

    입력
    4
    abcd
    
    예상 출력
    4
    
  3. 예제 3

    입력
    5
    tcoct
    
    예상 출력
    60
    
  4. 예제 4

    입력
    62
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    
    예상 출력
    1025495382