您的位置:首页 > 其它

HDU 5955 AC自动机+高斯消元

2017-10-08 15:00 323 查看
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
const int SIGMA_SIZE=6;
const int MAXNODE=100+20;
const int maxn=12;
int idx[10];
void init()
{
for(int i=0;i<6;i++){
idx[i+1]=i;
}
}
void Gauss(double A[MAXNODE][MAXNODE],int n)
{
int i,j,k,r;
for(i=0;i<n;i++){
r=i;
for(j=i+1;j<n;j++)
if(fabs(A[j][i])>fabs(A[r][i])) r=j;
if(r!=i)    for(j=0;j<=n;j++)   swap(A[r][j],A[i][j]);
for(k=i+1;k<n;k++){
double f=A[k][i]/A[i][i];
for(j=i;j<=n;j++)   A[k][j]-=f*A[i][j];
}
}
for(i=n-1;i>=0;i--){
for(j=i+1;j<n;j++){
A[i]
-=A[j]
*A[i][j];

}
A[i]
/=A[i][i];
}

}
struct ACAutomata{
int ch[MAXNODE][SIGMA_SIZE];
int f[MAXNODE];
int val[MAXNODE];
int last[MAXNODE];
int sz;
double A[MAXNODE][MAXNODE];
bool vis[MAXNODE];
void init()
{
memset(ch[0],0,sizeof(ch[0]));
sz=1;
}
void insert(int s[],int n,int v)
{
int u=0;
for(int i=0;i<n;i++){
int c=idx[s[i]];
if(!ch[u][c]){
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
void getFail()
{
queue<int> que;
int u=0;
f[0]=0;
for(int c=0;c<SIGMA_SIZE;c++){
u=ch[0][c];
if(u){
f[u]=0;last[u]=0;
que.push(u);
}
}
while(!que.empty()){
int r=que.front();que.pop();
for(int c=0;c<SIGMA_SIZE;c++){
u=ch[r][c];
if(!u){
ch[r][c]=ch[f[r]][c];
continue;
}
que.push(u);
int v=f[r];
while(v&&!ch[v][c]){
v=f[v];
}
f[u]=ch[v][c];
last[u]=val[f[u]]?f[u]:last[f[u]];
if(!val[u]){
val[u]=val[f[u]]?1:0;
}
}
}
}

double GetMatrix(int pos,int N)
{
memset(A,0,sizeof(A));
for(int u=0;u<sz;u++){
if(val[u]){
if(val[u]==pos){
A[u][sz]=1.0;
A[u][u]=1.0;
}
else{
A[u][u]=1.0;
A[u][sz]=0.0;
}
continue;
}
else{
A[u][u]=6.0;
for(int i=0;i<SIGMA_SIZE;i++){
//                  printf("%d %d\n",u,ch[u][i]);
A[u][ch[u][i]]-=1.0;
}
}
}
//      for(int i=0;i<sz;i++){
//          for(int j=0;j<=sz;j++){
//              printf("%0.2lf ",A[i][j]);
//          }
//          printf("\n");
//      }
Gauss(A,sz);
//      for(int i=0;i<sz;i++){
//          for(int j=0;j<=sz;j++){
//              printf("%0.2lf ",A[i][j]);
//          }
//          printf("\n");
//      }
return A[0][sz];
}
};
ACAutomata ac;
int str[maxn][maxn];
int T,N;
int len;
void solve();
int main()
{
init();
scanf("%d",&T);
while(T--){
solve();
}
return 0;
}
void solve()
{
ac.init();
scanf("%d %d",&N,&len);
for(int i=1;i<=N;i++){
for(int j=0;j<len;j++){
scanf("%d",&str[i][j]);
}
ac.insert(str[i],len,i);
}
ac.getFail();
for(int i=1;i<=N;i++){
double ans=ac.GetMatrix(i,N);
if(i!=1) printf(" ");
printf("%0.6lf",ans);
}
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: