CF1070H 题解

思路

我们第一眼看题就发现每个字符串的长度在只有 \(8\)

我们需要判断的是某个字符串是不是前面字符串的子串,因为长度太小,所以可以把字符串的每一个子串放到 map 里,再用一个 map 判断一个子串是否在当前字符串出现过,出现过就不能重复记。最后在用一个 map 记录一下每个子串对应哪个字符串,然后这题就切了。

AC CODE


#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
map<string,int>mp;
map<string,string>mp2;
map<string,bool>mp3;
int n,m;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		mp3.clear();
		for(int i=0;i<s.size();i++){
			string tmp="";
			for(int j=i;j<s.size();j++){
				tmp+=s[j];
				if(!mp3[tmp]){
					mp3[tmp]=1;
					mp[tmp]++;
					mp2[tmp]=s;
				}
			}
		}
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		string s;
		cin>>s;
		if(!mp[s]){
			cout<<"0 -\n";
		}
		else{
			cout<<mp[s]<<" "<<mp2[s]<<'\n';
		}
	}
	return 0;
}
posted @ 2024-01-28 21:43  Xu_dh  阅读(25)  评论(0)    收藏  举报