2 条题解

  • 0
    @ 2025-10-8 17:10:25
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e7+10, M=1e5+10;
    int id, ch[N][4], pre[N], ys[150];
    char str[N], t[M][105];
    void ins(char *s)
    {
        int p=0;
        for(int i=0;s[i];i++)
        {
            int j=ys[s[i]];
            if(!ch[p][j]) ch[p][j]=++id;
            p=ch[p][j];
        }
    }
    bool v[N];
    void AC()
    {
        queue<int>q;for(int i=0;i<4;i++) if(ch[0][i]) q.push(ch[0][i]);
        while(!q.empty())
        {
            int x=q.front();q.pop();
            for(int i=0;i<4;i++)
            {
                int &y=ch[x][i];
                if(y==0)     y=ch[ pre[x] ][i];
                else    pre[y]=ch[ pre[x] ][i], q.push(y);
            }
        }
        int p=0;memset(v,0,sizeof(v));
        for(int i=0;str[i];i++)
        {
            p=ch[p][ys[str[i]]];
            for(int j=p;j && !v[j] ;j=pre[j])v[j]=1;
        }
    }
    int query(char *s)
    {
        int p=0, ret=0;
        for(int i=0;s[i];i++)
        {
            p=ch[p][ys[s[i]]];
            if(v[p])ret=i+1;
        }
        return ret;
    }
    int main()
    {
        ys['E']=0, ys['S']=1, ys['W']=2, ys['N']=3;
        int n, m;scanf("%d%d", &n, &m);
        scanf("%s", str);
        id=0;memset(ch,0,sizeof(ch));
        for(int i=1;i<=m;i++)scanf("%s", t[i]), ins(t[i]);
        memset(pre,0,sizeof(pre));AC();    
        for(int i=1;i<=m;i++)printf("%d\n", query(t[i]));
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:10:10
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e7+10,M=1e5+10;
      int id,ch[N][4],pre[N],ys[150];
      char str[N],t[M][105];
      void ins(char *s)
      {
      	int p=0;
      	for(int i=0;s[i];i++)
      	{
      		int j=ys[s[i]];
      		if(!ch[p][j]) ch[p][j]=++id;
      		p=ch[p][j];
      	}
      }
      bool v[N];
      void AC()
      {
      	queue<int>q;for(int i=0;i<4;i++) if(ch[0][i]) q.push(ch[0][i]);
      	while(!q.empty())
      	{
      		int x=q.front();q.pop();
      		for(int i=0;i<4;i++)
      		{
      			int &y=ch[x][i];
      			if(y==0)     y=ch[ pre[x] ][i];
      			else    pre[y]=ch[ pre[x] ][i],q.push(y);
      		}
      	}
      	int p=0;memset(v,0,sizeof(v));
      	for(int i=0;str[i];i++)
      	{
      		p=ch[p][ys[str[i]]];
      		for(int j=p;j && !v[j] ;j=pre[j])v[j]=1;
      	}
      }
      int query(char *s)
      {
      	int p=0,ret=0;
      	for(int i=0;s[i];i++)
      	{
      		p=ch[p][ys[s[i]]];
      		if(v[p])ret=i+1;
      	}
      	return ret;
      }
      int main()
      {
      	ys['E']=0,ys['S']=1,ys['W']=2,ys['N']=3;
      	int n,m;scanf("%d%d",&n,&m);
      	scanf("%s",str);
      	id=0;memset(ch,0,sizeof(ch));
      	for(int i=1;i<=m;i++)scanf("%s",t[i]),ins(t[i]);
      	memset(pre,0,sizeof(pre));AC();	
      	for(int i=1;i<=m;i++)printf("%d\n",query(t[i]));
      	return 0;
      }
      • 1

      信息

      ID
      5992
      时间
      2000ms
      内存
      512MiB
      难度
      7
      标签
      递交数
      61
      已通过
      16
      上传者