#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; void shift_letter(char &letter, int t){ t = t % 26; letter += 26; if (letter >= 97 + 26) //Could do a mod instead letter -= 26; /*if ((letter - 97) + t >= 97 + 26) letter = (((letter - 97) + t) % 26) + 97; else letter = letter + t;*/ } void shift_range(string &str, int i, int j, int t){ for ( ; i <= j; i++) shift_letter(str.at(i), t); } long long count_palindromic_subsets(const string &str, int i, int j){ long long numSubsets = 0; int jEnd = j; for ( ; i <= jEnd; i++){ int charCount[26] = {0}; //Need to make sure this is right int numOddChars = 0; for (j = i; j <= jEnd; j++){ charCount[str.at(j) - 97]++; if (charCount[str.at(j) - 97] % 2 == 1) numOddChars++; else //if (charCount[str.at(j) - 97] % 2 == 0) numOddChars--; if (numOddChars <= 1) numSubsets++; } } return numSubsets % 1000000007; } int main(){ int n; int q; cin >> n >> q; string s; cin >> s; for(int a0 = 0; a0 < q; a0++){ int opCode; cin >> opCode; if (opCode == 1){ int i, j, t; cin >> i >> j >> t; shift_range(s, i, j, t); } else if (opCode == 2){ int i, j; cin >> i >> j; cout << count_palindromic_subsets(s, i, j) << endl; } } return 0; }