我 人 傻 了
查看原帖
我 人 傻 了
50477
linfourxu楼主2020/12/24 12:12
#include<bits/stdc++.h>
using namespace std;

#define re register
#define rint re int
#define ll long long
#define rll re ll
#define db double
#define rdb re db
#define rch re char
#define un unsigned
#define ull un ll
#define rull re ull

template <typename T> T read()
{
	rch ch=getchar();re T ans=0;rint f=1;
	for(;!isdigit(ch);ch=getchar())
		ch=='-'?f=-1:0;
	for(;ch>='0';ch=getchar())
		ans=ans*10+(ch&15);
	return ans*f;
}

const int maxn=3e2+10;
const int N=3e2;
const db minlf=1e-8;
const int tran=233;

db pw2[maxn];
char s[maxn];
ull hspow[maxn];
ull hs[maxn][maxn];
db a[maxn][maxn];

int main()
{
	rint n=read<int>(),m=read<int>();
	pw2[0]=1.0,hspow[0]=1;
	for(rint i=1;i<=N;i++) pw2[i]=pw2[i-1]*2.0,hspow[i]=hspow[i-1]*tran;
	for(rint i=1;i<=n;i++)
	{
		scanf("%s",s+1);
		for(rint j=1;j<=m;j++) hs[i][j]=hs[i][j-1]*tran+s[j];
	}
	for(rint i=1;i<=n;i++)
	{
		a[i][n+1]=-1.0;
		for(rint j=1;j<=n;j++)
			for(rint k=1;k<=m;k++)
				if(hs[j][m]-hs[j][m-k]*hspow[k]==hs[i][k])
					a[i][j]+=pw2[k];
	}
	for(rint i=1;i<=n;i++) a[n+1][i]=1.0;a[n+1][n+2]=1.0;
	for(rint i=1;i<=n+1;i++)
	{
		rint pos=i;
		for(rint j=i+1;j<=n+1;j++) //这里写 j=i 就过了,j=i+1 就WA60 
			if(abs(a[j][i])>minlf)
			{
				pos=j;
				break;
			}
		swap(a[i],a[pos]);
		for(rint j=i+1;j<=n+2;j++)
			a[i][j]/=a[i][i];
		a[i][i]=1.0;
		for(rint j=1;j<=n+1;j++)
		{
			if(i==j) continue;
			for(rint k=i+1;k<=n+2;k++)
				a[j][k]-=a[j][i]*a[i][k];
			a[j][i]=0.0;
		}
	}
	for(rint i=1;i<=n;i++) printf("%.10lf\n",a[i][n+2]);
	return 0;
}
2020/12/24 12:12
加载中...