int main() { int n; while (EOF != scanf("%d", &n)) { memset(nd, 0, sizeof(nd[0])); nNd = 1; int x = 0; for (int i = 0; i < n; ++i) { scanf("%d %s", &len[i], s0 + x); bg[i] = x; for (int j = 0; j < len[i]; ++j) { s1[x + j] = s0[x + len[i] - j - 1]; } s1[x + len[i]] = 0; extend_kmp(len[i], s0 + x, ext0 + x, len[i], s1 + x, next, is0 + x); extend_kmp(len[i], s1 + x, ext1 + x, len[i], s0 + x, next, is1 + x); insert(len[i], s0 + x, is0 + x); x += len[i] + 1; } long long ans = 0; for (int i = 0; i < n; ++i) { int p = 0, j = 0; for (j = bg[i]; j < bg[i] + len[i]; ++j) { p = nd[p].ch[s1[j] - 'a']; if (p == 0) break; if (is1[j+1]) ans += nd[p].leaf; } if (p) ans += nd[p].cnt; } printf("%lld\n", ans); } return 0; }
int main(int argc, char const *argv[]) { int T, t=1; scanf("%d",&T); while(T--){ scanf("%s", sub_str); strcpy(str,sub_str); strcat(str,sub_str); //init_next(); extend_kmp(); int cnt[3]={0,0,0}; int i=0; for( ; i<sub_len; i++){ if(extend[i] >= sub_len ) cnt[1]++; else{ if(str[i+extend[i]] < sub_str[extend[i]]) cnt[0]++; else cnt[2]++; } } k_next(); int tmp = sub_len - next[sub_len]; int tol = 1; if(sub_len%tmp==0) tol = sub_len/tmp; printf("Case %d: %d %d %d\n",t++, cnt[0]/tol, cnt[1]/tol,cnt[2]/tol ); } return 0; }