示例#1
0
void work(char *s1, char *s2)
{
	int l1 = strlen(s1);
	int l2 = strlen(s2);
	for (int i = 1; i <= l2; i++) s[i] = s2[i-1];
	for (int i = 1; i <= l1; i++) s[i+l2] = s1[i-1];
	init_kmp(s, l1 + l2, p);
	if (p[l1+l2] < len) return;
	if (p[l1+l2] >= l1 || p[l1+l2] >= l2)
	{
		if (l1 > l2)
		{
			if (len < p[l1+l2] || strcmp(ans, s1) > 0)
			strcpy(ans, s1);
		}
		else 
		{
			if (len < p[l1+l2] || strcmp(ans, s2) > 0)
			strcpy(ans, s2);
		}
	}
	else
	{
		strcpy(tmp, s1);
		strcpy(tmp+l1, s2+p[l1+l2]);
		if (len < p[l1+l2] || strcmp(ans, tmp) > 0)
			strcpy(ans, tmp);
	}
	if (len < p[l1+l2]) len = p[l1+l2];
}
示例#2
0
ll naive(ll l, ll r) {
  ll ans = 0;
  for (ll x = l; x <= r; ++x) {
    string s = b2s(x);
    int n = s.length(), k = init_kmp(s);
    if (k < n && n % k == 0) {
      cerr << " " << s << endl;
      ans += 1;
    }
  }
  return ans;
}
示例#3
0
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n;
		scanf("%d", &n);
		scanf("%s", s+1);
		init_kmp(s, n);
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; i++) dp[p[i]]++;
		for (int i = n; i >= 1; i--)
		{
			dp[p[i]] = (dp[p[i]] + dp[i]) % MOD;
		}
		int ans = 0;
		for (int i = 1; i <= n; i++)
			ans = (ans + dp[i]) % MOD;
		ans = (ans + n) % MOD;
		printf("%d\n", ans);
	}
	return 0;
}
示例#4
0
static int __init init(void)
{
	init_bm();
	init_kmp();
	return ipt_register_match(&string_match);
}