作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 3e6+5;
int T,n,tree[N][63],q,tot,mp[N];
string s[100005];
void insert(string s){
	int u = 0;
	for(int i=0;i<s.size();i++){
		int v = 0;
		if(s[i]>='a' && s[i]<='z')v=s[i]-'a';
		if(s[i]>='A' && s[i]<='Z')v=s[i]-'A'+26;
		if(s[i]>='0' && s[i]<='9')v=s[i]-'0'+52;
		int c = tree[u][v];
		if(!c)tree[u][v]=++tot;
		u = tree[u][v];
		mp[u]++;
	}
}
int find(string s){
	int u = 0;
	for(int i=0;i<s.size();i++){
		int v = 0;
		if(s[i]>='a' && s[i]<='z')v=s[i]-'a';
		if(s[i]>='A' && s[i]<='Z')v=s[i]-'A'+26;
		if(s[i]>='0' && s[i]<='9')v=s[i]-'0'+52;
		if(tree[u][v]==0)return 0;
		u = tree[u][v];
	}
	return mp[u];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--){
		for(int i=0;i<tot;i++){
			mp[i] = 0;
			for(int j=0;j<=62;j++){
				tree[i][j] = 0;
			}
		}
		tot = 0;
		cin>>n>>q;
		for(int i=1;i<=n;i++){
			cin>>s[i];
			insert(s[i]);
		}
		while(q--){
			string s;
			cin>>s;
			cout<<find(s)<<endl;
		}
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 4e6+5;
int tree[N][2],n,a[100005],tot,mp[N];
void insert(int x){
	int u = 0;
	for(int j=31;j>=0;j--){
		int v = (x>>(j-1))&1;
		int c = tree[u][v];
		if(!c)tree[u][v]=++tot;
		u = tree[u][v];
	}
	mp[u] = x;
}
int find(int x){
	int u = 0;
	for(int j=31;j>=0;j--){
		int v = (x>>(j-1))&1;
		int c = tree[u][v^1];
		if(!c)u = tree[u][v];
		else u = c;
	}
	return x^mp[u];
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		insert(a[i]);
	}
	int res = 0;
	for(int i=1;i<=n;i++){
		res = max(res,find(a[i]));
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
#define int long long
struct node{
	int v,w;
};
vector<node>e[N];
int sum[N],n,tot;
int tree[N*32+5][2],mp[N*32];
void dfs(int x,int fa){
	for(auto [v,w]:e[x]){
		if(v==fa)continue;
		sum[v] = sum[x]^w;
		dfs(v,x);
	}
}
void insert(int x){
	int u = 0;
	for(int j=31;j>=1;j--){
		int v = (x>>(j-1))&1;
		int c = tree[u][v];
		if(!c)tree[u][v]=++tot;
		u = tree[u][v];
	}
	mp[u] = x;
}
int find(int x){
	int u = 0;
	for(int j=31;j>=1;j--){
		int v = (x>>(j-1))&1;
		int c = tree[u][v^1];
		if(!c)u=tree[u][v];
		else u = tree[u][v^1];
	}
	return mp[u]^x;
}
signed main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y,z;
		cin>>x>>y>>z;
		e[x].push_back({y,z});
		e[y].push_back({x,z});
	}
	dfs(1,0);
	for(int i=1;i<=n;i++){
		insert(sum[i]);
	}
	int res = 0;
	for(int i=1;i<=n;i++){
		res = max(res,find(sum[i]));
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 151*71;
struct node{
	int son[26],fail;
}tree[N];
int n,tot,mp[N],vis[N],T[N];
string s[N];
void insert(string s,int id){
	int u = 0;
	for(int i=0;i<s.size();i++){
		int v= s[i]-'a';
		int c = tree[u].son[v];
		if(!c)tree[u].son[v] = ++tot;
		u = tree[u].son[v];
	}
	vis[u] = 1;
	T[id] = u;
}
void GetFail(){
	queue<int>q;
	for(int i=0;i<26;i++){
		int c = tree[0].son[i];
		if(c){
			q.push(c);
			tree[c].fail = 0;
		}
	}
	while(!q.empty()){
		int u = q.front();
		q.pop();
		int fa = tree[u].fail;
		for(int v=0;v<26;v++){
			int c = tree[u].son[v];
			if(c){
				q.push(c);
				tree[c].fail = tree[fa].son[v];
			}
			else tree[u].son[v] = tree[fa].son[v];
		}
	}
}
void find(string str){
	int u = 0;
	for(int i=0;i<str.size();i++){
		int v = str[i]-'a';
		int c = tree[u].son[v];
		while(c){
			mp[c]++;
			c = tree[c].fail;
		}
		u = tree[u].son[v];
	}
	int res = 0;
	for(int i=1;i<=n;i++){
		if(mp[T[i]]>res){
			res = mp[T[i]];
		}
	}
	cout<<res<<endl;
	for(int i=1;i<=n;i++){
		if(mp[T[i]]==res){
			cout<<s[i]<<endl;
		}
	}
}
int main(){
	while(cin>>n){
		if(!n)return 0;
		for(int i=0;i<=tot;i++){
			tree[i].fail = 0;
			mp[i] = 0;
			for(int j=0;j<26;j++){
				tree[i].son[j] = 0;
			}
		}
		tot = 0;
		for(int i=1;i<=n;i++){
			cin>>s[i];
			insert(s[i],i);
		}
		GetFail();
		string str;
		cin>>str;
		find(str);
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6+5;
struct node{
	int son[27],fail;
}tree[N];
int n,tot,mp[N],in[N],f[N];
string s[N];
void insert(string s,int id){
	int u = 0;
	for(int i=0;i<s.size();i++){
		int v = s[i]-'a';
		int c = tree[u].son[v];
		if(!c)tree[u].son[v] = ++tot;
		u = tree[u].son[v];
	}
	mp[id] = u;
}
void GetFail(){
	queue<int>q;
	for(int i=0;i<26;i++){
		int c=tree[0].son[i];
		if(c){
			q.push(c);
			tree[c].fail = 0;
		}
	}
	while(!q.empty()){
		int u = q.front();
		q.pop();
		int fa = tree[u].fail;
		for(int v=0;v<26;v++){
			int c = tree[u].son[v];
			if(c){
				q.push(c);
				tree[c].fail = tree[fa].son[v];
				in[tree[fa].son[v]]++;
			}
			else tree[u].son[v] = tree[fa].son[v];
		}
	}
}
void find(string s){
	int u = 0;
	for(int i=0;i<s.size();i++){
		int v = s[i]-'a';
		int c = tree[u].son[v];
		f[c]++;
		u = tree[u].son[v];
	}
}
void topsort(){
	queue<int>q;
	for(int i=1;i<=tot;i++){
		if(in[i]==0)q.push(i);
	}
	while(!q.empty()){
		int u = q.front();q.pop();
		int v = tree[u].fail;
		in[v]--;
		if(in[v]==0)q.push(v);
		f[v]+=f[u];
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		insert(s[i],i);
	}
	GetFail();
	string str;
	cin>>str;
	find(str);
	topsort();
	for(int i=1;i<=n;i++){
		cout<<f[mp[i]]<<endl;
	}
	return 0;
}
状态
已结束
题目
20
开始时间
2026-4-30 0:00
截止时间
2026-5-26 23:59
可延期
24 小时