列表

详情


NC218885. 暗号I

描述

小凡和川农内鬼经常打盟盟,但是小凡不想要小源发现,于是川农内鬼发明了一种暗号来表示“打盟盟”。
暗号是一个只有小写字母的字符串,将字母一一映射为汉字。比如,那么所表示的中文意思就是“打盟盟”。
如果两个字符串,通过不同的字目映射关系可以转换为一样的中文意思,那么称这两个暗号本质相同。
比如都是本质相同的。
一天,小源从小凡聊天记录里面翻出了个暗号,她想知道一个暗号,在一个区间内内,有几个暗号与本质相同。
一一映射(双射):两集合元素间的唯一对应,通俗来讲就是一个对一个,一个字母对应一个汉字,一个汉字只能被一个字母对应。

输入描述

第一行两个整数表示暗号个数,表示询问次数。
第二行个字符串s_i
接下来行,每行一个字符串t_i,两个整数
表示字符串的长度,保证

输出描述

每行输出一个整数。

示例1

输入:

2 2
aa ab
bb 1 2
ab 1 2

输出:

1
1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 385ms, 内存消耗: 5548K, 提交时间: 2021-03-21 15:43:20

#include<bits/stdc++.h>
using namespace std;
map<string,vector<int> >mp;
string hx(string s){
	string res="";
	int visit[30]={0};
	int y = 1;
	for(int i=0;i<s.size();i++){
		int t = s[i] - 'a';
		if(!visit[t]){
			visit[t] = y++;
		}
		res += visit[t]+'a'-1;
	}
	return res;
}

int main(){
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		mp[hx(s)].push_back(i);
	}
	
	while(q--){
		string ss;
		int L,R;
		cin>>ss>>L>>R;
		vector<int> &w = mp[hx(ss)]; //**
		cout<<upper_bound(w.begin(),w.end(),R)-lower_bound(w.begin(),w.end(),L)<<endl;
	}
	
}

上一题