QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#417493 | #8713. 不要玩弄字符串 | Afterlife | WA | 0ms | 13904kb | C++17 | 3.1kb | 2024-05-22 19:17:49 | 2024-05-22 19:17:49 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=18,M=8*18+10;
int n;
int v[1<<N];
int son[M][2],fail[M],ed[M],tot;
int f[M][1<<N];
int deg[M];
vector<int> g[M];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
son[0][0]=son[0][1]=-1;
cin>>n;
for(int i=0;i<n;i++)
{
string s;
cin>>s;
cin>>v[1<<i];
int x=0;
for(auto ch:s)
{
ch-='0';
if(son[x][ch]==-1)
{
son[x][ch]=++tot;
son[tot][0]=son[tot][1]=-1;
}
x=son[x][ch];
}
ed[x]|=1<<i;
}
for(int i=0;i<n;i++)
for(int S=0;S<(1<<n);S++)
if(S>>i&1)
v[S]+=v[S^(1<<i)];
queue<int> q;
for(int i=0;i<2;i++)
if(son[0][i]!=-1)
q.push(son[0][i]);
else
son[0][i]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
ed[x]|=ed[fail[x]];
for(int i=0;i<2;i++)
if(son[x][i]==-1)
son[x][i]=son[fail[x]][i];
else
fail[son[x][i]]=son[fail[x]][i],q.push(son[x][i]);
}
for(int S=(1<<n)-2;S>=0;S--)
{
priority_queue<pair<int,int> >Q;
vector<int> done(tot+1);
for(int i=0;i<=tot;i++)
g[i].clear(),deg[i]=0,done[i]=0;
for(int i=0;i<=tot;i++)
{
f[i][S]=-1e18;
for(int j=0;j<2;j++)
{
int ni=son[i][j];
int nS=S|ed[ni];
if(nS>S)
f[i][S]=max(f[i][S],v[nS^S]-f[ni][nS]);
else
g[ni].push_back(i),deg[i]++;
}
if(f[i][S]>0||!deg[i])
Q.push({-f[i][S],i});
}
// cerr<<"?"<<endl;
while(!Q.empty())
{
auto [dp,x]=Q.top();
Q.pop();
if(done[x])
continue;
done[x]=1;
for(auto v:g[x])
{
if(f[x][S]>0)
{
if(-f[x][S]>f[v][S])
f[v][S]=-f[x][S],Q.push({f[v][S],v});
}
else
{
if(-f[x][S]>f[v][S])
f[v][S]=-f[x][S];
if(!--deg[v])
{
if(f[v][S]<=0)
Q.push({f[v][S],v});
}
}
}
}
for(int i=0;i<=tot;i++)
if(deg[i])
f[i][S]=max(f[i][S],0ll);
}
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
int x=0,S=0;
for(auto ch:s)
{
ch-='0';
x=son[x][ch];
S|=ed[x];
}
// for(int i=0;i<n;i++)
// if(!(S>>i&1))
// cout<<i<<endl;
cout<<f[x][S]<<"\n";
}
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 13904kb
input:
3 11 1 0 2 000 3 2 0 1
output:
0 2
result:
wrong answer 1st numbers differ - expected: '-1', found: '0'