QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#339566#7401. Ternary String RevolutionKevin5307TL 934ms97504kbC++203.2kb2024-02-27 15:54:472024-02-27 15:54:48

Judging History

你现在查看的是最新测评结果

  • [2024-02-27 15:54:48]
  • 评测
  • 测评结果:TL
  • 用时:934ms
  • 内存:97504kb
  • [2024-02-27 15:54:47]
  • 提交

answer

//Author: Kevin
#include<bits/stdc++.h>
//#pragma GCC optimize("O2")
using namespace std;
#define ll long long
#define ull unsigned ll
#define pb emplace_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define rALL(x) (x).rbegin(),(x).rend()
#define srt(x) sort(ALL(x))
#define rev(x) reverse(ALL(x))
#define rsrt(x) sort(rALL(x))
#define sz(x) (int)(x.size())
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define lb(v,x) (int)(lower_bound(ALL(v),x)-v.begin())
#define ub(v,x) (int)(upper_bound(ALL(v),x)-v.begin())
#define uni(v) v.resize(unique(ALL(v))-v.begin())
#define longer __int128_t
void die(string S){puts(S.c_str());exit(0);}
vector<string> vec;
unordered_map<string,int> Mp;
vector<int> fa;
vector<int> state;
vector<vector<int>> trans;
vector<int> inverse;
vector<string> id;
void init()
{
	const int len=12,lim=4;
	vec.pb("");
	for(int i=1;i<=len;i++)
	{
		int n=sz(vec);
		for(int j=0;j<n;j++)
			if(sz(vec[j])==i-1)
				for(int k=0;k<3;k++)
					vec.pb(vec[j]+(char)(k^48));
	}
	for(int i=0;i<sz(vec);i++)
		Mp[vec[i]]=i;
	fa.resize(sz(vec));
	for(int i=0;i<sz(fa);i++)
		fa[i]=i;
	auto connect=[&](int u,int v)
	{
		while(fa[u]!=u)
			u=fa[u]=fa[fa[u]];
		while(fa[v]!=v)
			v=fa[v]=fa[fa[v]];
		if(u>v) swap(u,v);
		fa[v]=u;
	};
	for(int i=0;i<sz(vec);i++)
	{
		string cur=vec[i];
		for(int j=0;j<sz(cur)-2;j++)
			if(cur.substr(j,3)=="111")
			{
				string ns=cur.substr(0,j)+"20"+cur.substr(j+3);
				connect(i,Mp[ns]);
			}
		for(int j=0;j<sz(cur)-2;j++)
			if(cur.substr(j,3)=="012")
			{
				string ns=cur.substr(0,j)+cur.substr(j+3);
				connect(i,Mp[ns]);
			}
		for(int j=0;j<sz(cur)-1;j++)
			if(cur.substr(j,2)=="00")
			{
				string ns=cur.substr(0,j)+"12"+cur.substr(j+2);
				connect(i,Mp[ns]);
			}
		for(int j=0;j<sz(cur)-1;j++)
			if(cur.substr(j,2)=="22")
			{
				string ns=cur.substr(0,j)+cur.substr(j+2);
				connect(i,Mp[ns]);
			}
	}
	state.resize(sz(vec));
	int tot=0;
	for(int i=0;i<sz(vec);i++)
		if(fa[i]==i&&sz(vec[i])<=lim)
			state[i]=tot++;
	id.resize(tot);
	for(int i=0;i<sz(vec);i++)
		if(fa[i]==i&&sz(vec[i])<=lim)
			id[state[i]]=vec[i];
	for(int i=0;i<sz(vec);i++)
	{
		int tmp=i;
		while(fa[tmp]!=tmp) tmp=fa[tmp]=fa[fa[tmp]];
		state[i]=state[tmp];
	}
	inverse.resize(tot);
	trans.resize(tot);
	for(int i=0;i<tot;i++)
	{
		trans[i].resize(tot);
		for(int j=0;j<tot;j++)
			trans[i][j]=state[Mp[id[i]+id[j]]];
	}
	for(int i=0;i<tot;i++)
		for(int j=0;j<tot;j++)
			if(!trans[i][j])
				inverse[i]=j;
//for(int i=0;i<tot;i++)
//for(int j=0;j<tot;j++)
//assert(trans[i][j]==trans[j][i]);
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	init();
	int t;
	cin>>t;
	while(t--)
	{
		int n,m;
		cin>>n>>m;
		vector<ll> cnt(sz(id));
		vector<ll> ans(sz(id));
		string s;
		cin>>s;
		int cur=0;
		cnt[0]++;
		for(int i=sz(s)-1;i>=0;i--)
		{
			cur=trans[state[Mp[s.substr(i,1)]]][cur];
			for(int j=0;j<sz(cnt);j++)
				ans[trans[cur][j]]+=cnt[j];
			cnt[inverse[cur]]++;
		}
		while(m--)
		{
			string t;
			cin>>t;
			int st=0;
			for(int i=0;i<sz(t);i++)
				st=trans[st][state[Mp[t.substr(i,1)]]];
			cout<<ans[st]<<'\n';
		}
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 934ms
memory: 97504kb

input:

2
11 4
01021001020
0
1
2
012
6 3
012210
0
1
2

output:

6
3
4
0
2
4
4

result:

ok 7 tokens

Test #2:

score: -100
Time Limit Exceeded

input:

181890
4 2
0121
0
2
1 2
2
2
0
7 3
2102011
122
21
2
9 1
222022212
01
7 2
0122000
0
0
1 2
2
2
212
10 2
1111011000
1210
02
2 3
01
222
22
22
10 3
1121121121
21
2
1
10 4
2201210022
202
122
20
00
7 2
0102010
221222
2
1 3
2
20
212
21
5 5
21112
00101221
202
0
20
0
9 3
022200012
10
2021
0
8 2
12212200
122
1
...

output:

1
2
1
0
4
2
4
9
5
5
1
0
1
2
1
0
0
3
3
7
0
5
1
3
1
3
0
0
0
2
1
1
1
1
0
0
7
6
6
2
2
2
2
2
1
4
4
3
2
0
1
1
0
0
0
2
0
2
1
1
1
1
3
0
0
1
3
0
3
3
7
3
3
0
0
1
1
0
1
3
1
1
5
2
1
2
1
0
7
2
2
5
5
5
5
0
3
3
0
3
3
2
0
2
3
1
0
0
0
2
3
3
3
3
3
6
1
0
0
2
1
0
0
2
1
3
2
1
2
4
4
4
4
3
3
4
4
2
5
5
0
0
1
0
1
0
0
3
3
2
...

result: