社区讨论
关于struct
P3966[TJOI2013] 单词参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mm8ri8e8
- 此快照首次捕获于
- 2026/03/02 13:52 上周
- 此快照最后确认于
- 2026/03/05 13:30 5 天前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
int nxt[26],fail;
}tp[N];
int n,cnt,g[N],ans[N],last[N],a[N],ano[N];
string s[205];
queue<int>q;
void add(string s,int num)
{
int u=0;
for(int i=0;i<s.size();i++)
{
int x=s[i]-'a';
if(!tp[u].nxt[x]) tp[u].nxt[x]=++cnt;
u=tp[u].nxt[x];
}
g[num]=u;
return ;
}
void fail()
{
for(int i=0;i<26;i++)
{
int k=tp[0].nxt[i];
if(k!=0)
{
tp[k].fail=0;
q.push(k);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
int f=tp[u].fail;
for(int i=0;i<26;i++)
{
int k=tp[u].nxt[i];
if(k!=0)
{
tp[k].fail=tp[f].nxt[i];
q.push(k);
a[tp[k].fail]++;
continue;
}
tp[u].nxt[i]=tp[f].nxt[i];
}
}
return ;
}
void query(string ss)
{
int u=0;
for(int i=0;i<ss.size();i++)
{
int x=ss[i]-'a';
u=tp[u].nxt[x];
ans[u]++;
}
return ;
}
void bfs()
{
for(int i=1;i<=cnt;i++)
if(!a[i]) q.push(i);
while(!q.empty())
{
int u=q.front();
q.pop();
a[tp[u].fail]--;
ans[tp[u].fail]+=ans[u];
if(!a[tp[u].fail]) q.push(tp[u].fail);
}
return ;
}
signed main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>s[i];
add(s[i],i);
}
fail();
for(int i=1;i<=cnt;i++) ano[i]=a[i];
for(int i=1;i<=n;i++)
{
memset(ans,0,sizeof ans);
memcpy(a,ano,sizeof ano);
query(s[i]);
bfs();
for(int i=1;i<=n;i++) last[i]+=ans[g[i]];
}
for(int i=1;i<=n;i++) printf("%d\n",last[i]);
return 0;
}
CPP#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node
{
int nxt[26];
}tp[N];
int n,cnt,g[N],ans[N],last[N],a[N],ano[N],fail[N];
string s[205];
queue<int>q;
void add(string s,int num)
{
int u=0;
for(int i=0;i<s.size();i++)
{
int x=s[i]-'a';
if(!tp[u].nxt[x]) tp[u].nxt[x]=++cnt;
u=tp[u].nxt[x];
}
g[num]=u;
return ;
}
void fff()
{
for(int i=0;i<26;i++)
{
int k=tp[0].nxt[i];
if(k!=0)
{
fail[k]=0;
q.push(k);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
int f=fail[u];
for(int i=0;i<26;i++)
{
int k=tp[u].nxt[i];
if(k!=0)
{
fail[k]=tp[f].nxt[i];
q.push(k);
a[fail[k]]++;
continue;
}
tp[u].nxt[i]=tp[f].nxt[i];
}
}
return ;
}
void query(string ss)
{
int u=0;
for(int i=0;i<ss.size();i++)
{
int x=ss[i]-'a';
u=tp[u].nxt[x];
ans[u]++;
}
return ;
}
void bfs()
{
for(int i=1;i<=cnt;i++)
if(!a[i]) q.push(i);
while(!q.empty())
{
int u=q.front();
q.pop();
a[fail[u]]--;
ans[fail[u]]+=ans[u];
if(!a[fail[u]]) q.push(fail[u]);
}
return ;
}
signed main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>s[i];
add(s[i],i);
}
fff();
for(int i=1;i<=cnt;i++) ano[i]=a[i];
for(int i=1;i<=n;i++)
{
memset(ans,0,sizeof ans);
memcpy(a,ano,sizeof ano);
query(s[i]);
bfs();
for(int i=1;i<=n;i++) last[i]+=ans[g[i]];
}
for(int i=1;i<=n;i++) printf("%d\n",last[i]);
return 0;
}
为什么一个TLE一个A?
回复
共 2 条回复,欢迎继续交流。
正在加载回复...