思路
我们第一眼看题就发现每个字符串的长度在只有 \(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;
}
标签:子串,map,int,题解,CF1070H,long,字符串
From: https://www.cnblogs.com/xdh2012/p/17993478