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;
}
Esempio n. 2
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;
}