求组 ! wa 23
查看原帖
求组 ! wa 23
792701
giao_abc楼主2024/5/27 15:55
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int >PII;
#define endl '\n'
const int N = 1e6+5;
int son[N][30],idx = 1;
int fa[N],ed[N],cnt[N];
int dp[N];
vector<int>vec;
void insert(string s,int id)
{	int p = 1;
	for(auto v : s)
	{	int u = v - 'a';
		if(!son[p][u]) son[p][u] = ++ idx;
		fa[son[p][u]] = p;
		p = son[p][u];
		cnt[p]++;
	}
	ed[p] = id;
}
void dfs(int u)
{	int t = 0,x = cnt[u],ans = 0;
	for(int i = 0; i <= 25;i++)
	{	if(!son[u][i]) continue;
		dfs(son[u][i]);
		if(cnt[son[u][i]] == x)
		t++,ans = dp[son[u][i]];
	}
	if(t == 1)
	dp[u] = ans;
 	else dp[u] = u;
}
void slove()
{	int n,m;
	cin >> n >> m;
	int cap = 1;
	for(int i = 1;i <= n;i++)
	{	string s;
		cin >> s;
		insert(s,i);
	}
	string str;
	cin >> str;
	fa[1] = 1;
	dfs(1);
	int S = 0;
	for(int i = 0;i < m;i++)
	{	char c = str[i];
		if( c >= 'a' && c <= 'z')
		{	if(S || !son[cap][c- 'a'])
			{
				S++;
				continue;
			}
			cap = son[cap][c - 'a'];
		}
		else if (c == 'T')
		{	if(S)	continue;
			cap = dp[cap];
		}
		else if (c == 'B')
		{	if(S)
			{S--;continue;}
			cap = fa[cap];
		}
		else 
		{	if(ed[cap] && !S)
			cout << ed[cap] << " ";
			else cout << -1 << " ";
			cap = 1;
			S = 0;
		}
	}
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    //int _;cin>>_;while(_--)
    slove();
    return 0;
}
2024/5/27 15:55
加载中...