Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define int long long
- using namespace std;
- const int INF=1e18;
- const int MOD=998244353;
- vector<int> v[100005], pxor(100005,-1);
- void dfs(int x, string &s){
- for(auto it:v[x]){
- if(pxor[it]!=-1) continue;
- pxor[it]=pxor[x]^(1<<(s[it]-'a'));
- dfs(it,s);
- }
- }
- int re(int x, vector<char>&r, string &s, int flag, vector<vector<int>>&dp){
- if(x==s.size()) return 1;
- if(dp[x][flag]!=-1) return dp[x][flag];
- if(flag==0){
- int ans=0;
- for(int i=0; i<r.size(); i++){
- ans+=re(x+1,r,s,flag,dp);
- ans%=MOD;
- }
- return dp[x][flag]=ans;
- }
- else{
- int ans=0;
- for(int i=0; i<r.size(); i++){
- if(r[i]<s[x]) ans+=re(x+1,r,s,0,dp);
- else if(r[i]==s[x]) ans+=re(x+1,r,s,1,dp);
- else break;
- ans%=MOD;
- }
- return dp[x][flag]=ans;
- }
- }
- signed main(){
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- int n;
- cin>>n;
- string s;
- cin>>s;
- s='#'+s;
- for(int i=0; i<n-1; i++){
- int a, b;
- cin>>a>>b;
- v[a].push_back(b);
- v[b].push_back(a);
- }
- pxor[1]=(1<<(s[1]-'a'));
- dfs(1,s);
- int q;
- cin>>q;
- while(q--){
- string a, b;
- int x, y;
- cin>>a>>b>>x>>y;
- int rf=pxor[x]^pxor[y];
- vector<char> vip;
- for(int i=0; i<26; i++) if((rf>>i)&1) vip.push_back(('a'+i));
- if(vip.size()==0){
- cout<<0<<'\n';
- continue;
- }
- vector<vector<int>> dp(a.length()+1,vector<int>(2,-1)), dp2(b.length()+1,vector<int>(2,-1));
- int ans=re(0,vip,b,1,dp);
- int ans2=re(0,vip,a,1,dp2);
- int fin=((ans-ans2)%MOD+MOD)%MOD;
- set<char> ne;
- for(auto it:vip) ne.insert(it);
- bool is=true;
- for(auto it:b) if(ne.find(it)==ne.end()) is=false;
- if(is) fin--;
- fin%=MOD;
- fin+=MOD;
- fin%=MOD;
- cout<<fin<<'\n';
- }
- }
Advertisement