include using namespace std; class PalindromicSubstring { private: int length; string text; int *r; public: PalindromicSubstring(const string &text) { this->text = " "; for (int i = 0; i < text.length(); i++) { this->text += text[i]; this->text += '#'; } this->length = (int) (2 * text.length() - 1); this->r = new int[this->length + 1]; } virtual ~PalindromicSubstring() { delete[] r; } void computeRadius(); void printRadius(); bool isPalindrome(int p, int q); }; void PalindromicSubstring::computeRadius() { int farPos = 1, cur = 2; r[1] = 0; while (cur <= length) { if (farPos + r[farPos] < cur) { r[cur] = 0; while (cur + r[cur] <= length && cur - r[cur] >= 1 && text[cur + r[cur]] == text[cur - r[cur]]) r[cur]++; r[cur]--; farPos = cur; } else { int opp = 2 * farPos - cur; if (cur + r[opp] < farPos + r[farPos]) { r[cur] = r[opp]; } else { r[cur] = farPos + r[farPos] - cur; while (cur + r[cur] <= length && cur - r[cur] >= 1 && text[cur + r[cur]] == text[cur - r[cur]]) r[cur]++; r[cur]--; farPos = cur; } } cur++; } } void PalindromicSubstring::printRadius() { for (int i = 1; i <= PalindromicSubstring::length; i++) { cout << text[i]; } cout << endl; for (int i = 1; i <= PalindromicSubstring::length; i++) { cout << r[i]; } cout << endl; } bool PalindromicSubstring::isPalindrome(int p, int q) { p = 2 * p - 1; q = 2 * q - 1; if (r[(p + q) / 2] >= (q - p) / 2) { return true; } else { return false; } } int main() { ios_base::sync_with_stdio(false); int z; cin >> z; while (z--) { string w; cin >> w; PalindromicSubstring palindromicSubstring(w); palindromicSubstring.computeRadius(); int q; cin >> q; while (q--) { int a, b; cin >> a >> b; cout << (palindromicSubstring.isPalindrome(a, b) ? "TAK" : "NIE") << endl; } } return 0; }