去掉就能ac
if( fabs( mp[i][i] )<eps ) continue;
但这不是特判零吗??因为这调了几个小时了....
#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-10;
#define ULL unsigned long long
const ULL base = 131;
const int maxn = 1009;
long double mp[maxn][maxn],po[maxn];
char s[maxn];
int n,m;
ULL p[maxn],suf[maxn][maxn],pre[maxn][maxn];
void guass(int n)
{
for(int i=0;i<=n;i++)
{
int r = i;
for(int j=i+1;j<=n;j++)
if( fabs(mp[r][i])<fabs(mp[j][i]) ) r = j;
if( i!=r ) swap( mp[i],mp[r] );
// if( fabs( mp[i][i] )<eps ) continue;
double div = mp[i][i];
for(int j=i;j<=n+1;j++) mp[i][j] /= div;
for(int j=0;j<=n;j++)
{
if( i==j ) continue;
div = mp[j][i];
for(int k=i;k<=n+1;k++) mp[j][k] -= div*mp[i][k];
}
}
for(int i=1;i<=n;i++) printf("%.10lf\n",(double)mp[i][n+1] );
}
int main()
{
cin >> n >> m;
p[0] = 1; po[0] = 1;
for(int i=1;i<=m;i++) p[i] = p[i-1]*base,po[i] = po[i-1]*0.5;
for(int i=1;i<=n;i++)
{
cin >> ( s+1 );
for(int j=1;j<=m;j++) pre[i][j] = pre[i][j-1]*base+s[j];
}
for(int i=1;i<=n;i++)
{
mp[i][i] = 1; mp[i][0] = -po[m];
for(int j=1;j<=n;j++)
{
for(int k=1;k<m;k++)
{
if( pre[i][k]==pre[j][m]-pre[j][m-k]*p[k] ) mp[i][j] += po[m-k];
}
}
}
for(int i=1;i<=n+1;i++) mp[0][i] = 1;
guass(n);
}