哭了
查看原帖
哭了
651786
yyc_楼主2023/4/9 15:03
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6+10;
char s[maxn];
string m[maxn];
queue<int> q;
int stk[maxn],k[maxn],n,tp,cnt;
vector<int> ec[maxn],tip[maxn];
struct { int s[26],p; }t[maxn];
inline void insert(int id,const char str[]) {
	int u = 0;
	for(int i = 0;str[i];++i) {
		const auto c = str[i] - 'a';
		if(!t[u].s[c]) t[u].s[c] = ++cnt;
		u = t[u].s[c];
	}
	ec[u].push_back(id);
}
inline void build() {
	for(int i = 0;i<26;++i) if(t[0].s[i]) q.push(t[0].s[i]);
	while(!q.empty()) {
		const int u = q.front(), p = t[u].p; q.pop();
		stk[++tp] = u;
		for(int i = 0;i<26;++i)
			if(t[u].s[i]) t[u].s[i][t].p = t[p].s[i], q.push(t[u].s[i]);
			else t[u].s[i] = t[p].s[i];
	}
}
inline void init(const char str[]) {
	int u = 0;
	for(int i = 0;str[i];++i) {
		u = t[u].s[str[i]-'a'];
		for(auto s: ec[u]) tip[s].push_back(i);
	}
	for(int i = tp;i;--i) {
		auto& cur = tip[stk[i]],& pre = tip[stk[i][t].p];
		auto psiz = pre.size();
		for(auto pos: cur) pre.push_back(pos);
		inplace_merge(pre.begin(),pre.begin()+psiz,pre.end());
		unique(pre.begin(),pre.end());
	}
}
signed main() {
	ios::sync_with_stdio(0),cin.tie(0);
//	ifstream ifs(".in");
//	ofstream ofs(".out");
//	cin.rdbuf(ifs.rdbuf()),cout.rdbuf(ofs.rdbuf());
	cin>>s>>n;
	for(int i = 1;i<=n;++i)
		cin>>k[i]>>m[i],
		insert(i,m[i].data());
	build(),init(s);
	for(int i = 1;i<=n;++i) {
		int ans = maxn*maxn,tcnt = tip[i].size();
		for(int l = 0,r = k[i]-1;r < tcnt;++l,++r) ans = min(ans,tip[i][r]-tip[i][l]);
		if(ans == maxn*maxn) cout<<"-1\n"; 
		else cout<<ans+m[i].size()<<'\n';
	}
}

错哪里了。。。

2023/4/9 15:03
加载中...