Another Meaning
.
.
解法:先用KMP判断哪些点是完全匹配,然后套个dp就可以了。
.
.
#include <cstdio>
#include <cstring>
int mo = 1000000007;
char x[100010], y[100010];
int next[100010], len, f[100010];
bool ok[100010];
void preKMP(int m)
{
int i, j;
j = next[0] = -1;
i = 0;
while (i < m)
{
while (-1 != j && x[i] != x[j]) j = next[j];
next[++i] = ++j;
}
}
void kmp()
{
int m = strlen(x), n = strlen(y), ans = 0, i, j;
preKMP(m);
i = j = 0;
while (i < n)
{
while (-1 != j && y[i] != x[j]) j = next[j];
i++; j++;
if (j >= m)
{
ok[i - 1] = true;
j = next[j];
}
}
}
int main()
{
int t, ca = 0;
scanf("%d", &t);
while (t--)
{
scanf("%s", y);
scanf("%s", x);
memset(next,0,sizeof(next));
memset(ok, false, sizeof(ok));
len = 0;
kmp();
f[0] = 1;
int p = strlen(x), q = strlen(y);
for (int i = 1; i <= q; i++)
{
if (!ok[i-1]) f[i] = f[i - 1];
else f[i] = (f[i - 1] + f[i - p]) % mo;
}
printf("Case #%d: %d\n", ++ca, f[q]);
}
}