#include #include #include using namespace std; #define mlog 20 #define sigma 26 #define maxn 200010 int n, m; int st[mlog][maxn], lvl[maxn]; int sum[maxn][sigma]; vector v[maxn]; char s[maxn]; void update(int tata, int nod) { st[0][nod]=tata; lvl[nod]=lvl[tata]+1; for(int i=1; st[i-1][st[i-1][nod]]!=0; ++i) st[i][nod]=st[i-1][st[i-1][nod]]; for(int i=0; ilvl[y]) swap(x, y); for(int i=mlog-1; i>=0; --i) if(lvl[st[i][y]]>=lvl[x]) y=st[i][y]; if(x==y) return x; for(int i=mlog-1; i>=0; --i) if(st[i][y]!=st[i][x]) { y=st[i][y]; x=st[i][x]; } x=st[0][x]; return x; } int main() { // freopen("tree.in", "r", stdin); scanf("%d%d\n", &n, &m); scanf("%s\n", s+1); for(int i=1; i