嘿嘿嘿!这一道题目也太简单了吧!我来公布答案吧!

#include <bits/stdc++.h>

const int mod1 = 1e9 + 7;
const int mod2 = 1e9 + 9;
const int N = 305;
char s[N][N]; double ex[N], f[N][N];
int a[N], p1[N], p2[N];
int pre1[N][N], pre2[N][N], suf1[N][N], suf2[N][N];
int n, m;

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i)
		scanf("%s", s[i] + 1);
	ex[0] = 1;
	for (int i = 1; i <= m; ++i)
		ex[i] = 0.5 * ex[i - 1];

	p1[0] = p2[0] = 1;
	for (int i = 1; i <= m; ++i)
	{
		p1[i] = 29ll * p1[i - 1] % mod1;
		p2[i] = 31ll * p2[i - 1] % mod2;
	}
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m; ++j)
			a[j] = s[i][j] == 'T' ? 5 : 7;
		for (int j = 1; j <= m; ++j)
		{
			pre1[i][j] = (29ll * pre1[i][j - 1] + a[j]) % mod1;
			pre2[i][j] = (31ll * pre2[i][j - 1] + a[j]) % mod2;
		}
		for (int j = 1; j <= m; ++j)
		{
			int tmp = m - j + 1;
			suf1[i][j] = (1ll * p1[j - 1] * a[tmp] + suf1[i][j - 1]) % mod1;
			suf2[i][j] = (1ll * p2[j - 1] * a[tmp] + suf2[i][j - 1]) % mod2;
		}
	}
	for (int i = 1; i <= n; ++i)
	{
		f[i][i] = 1.0;
		for (int j = 1; j <= n; ++j)
			for (int k = 1; k < m; ++k)
				if (suf1[j][k] == pre1[i][k] && suf2[j][k] == pre2[i][k])
					f[i][j] += ex[m - k];
		f[i][n + 1] -= ex[m];
	}
	for (int i = 1; i <= n; ++i)
		f[n + 1][i] = 1.0;
	f[n + 1][n + 2] = 1.0;

	++n;
	for (int i = 1; i <= n; ++i)
	{
		int p = i;
		for (int j = i + 1; j <= n; ++j)
			if (fabs(f[p][i]) < fabs(f[j][i]))
				p = j;
		if (p != i)
		{
			for (int j = i; j <= n + 1; ++j)
				std::swap(f[p][j], f[i][j]);
		}

		double tmp = f[i][i];
		for (int j = i; j <= n + 1; ++j)
			f[i][j] /= tmp;

		for (int j = 1; j <= n; ++j)
			if (j != i)
			{
				tmp = f[j][i];
				for (int k = i; k <= n + 1; ++k)
					f[j][k] -= tmp * f[i][k];
			}
	}
	for (int i = 1; i < n; ++i)
		printf("%.10lf\n", f[i][n + 1]);
}

代码有些长,请耐心观看

0 条评论

目前还没有评论...

信息

ID
185
时间
1000ms
内存
256MiB
难度
10
标签
(无)
递交数
2
已通过
2
上传者