字典树思路
用字典树搞一下就好了,比如aaaaa : a存5次 aa 4次以此类推~
字典树板子复习:P8306 【模板】字典树
这里这个清空方式 很好 因为很多时候memset T
#include<iostream>
#include<cstring>
using namespace std;
const int N = 3e6+10;
int n,m;
string s;
int tire[N][70],cnt[N],idx;
void insert(){
int p = 0;
for(auto &t:s){
int u;
if(t>='a'&&t<='z')u = t-'a';
else if(t>='A'&&t<='Z')u = t-'A'+ 27;
else u = t -'0'+54;
if(!tire[p][u]) tire[p][u]=++idx;
p = tire[p][u];
cnt[p]++;
}
}
int query(){
int p=0;
for(auto &t:s){
int u;
if(t>='a'&&t<='z')u = t-'a';
else if(t>='A'&&t<='Z')u = t-'A'+ 27;
else u = t -'0'+54;
if(!tire[p][u]) return 0;
p = tire[p][u];
}
return cnt[p];
}
void solve()
{
cin>>n>>m;
for(int i=0;i<=idx;i++)
for(int j=0;j<=65;j++)
tire[i][j] = 0;
for(int i=0;i<=idx;i++)cnt[i] = 0;
idx = 0;
while(n--)
{
cin>>s;insert();
}
while(m--){
cin>>s;cout<<query()<<"\n";
}
}
int main()
{
int _;cin>>_;
while(_--)solve();
}
本题代码;
const int N = 5e5+10;
int tr[N][27],cnt[N],idx;
class Solution {
public:
string str;
void insert(){
int ts = str.size();
int p = 0;
for(auto &t:str){
int u = t - 'a';
if(!tr[p][u])tr[p][u] = ++idx;
p = tr[p][u];
cnt[p]+=ts--;
}
}
int find(char c){
int p = 0;
int t = 0;
int u = c-'a';
while(cnt[tr[p][u]]>=3){
t++;
p = tr[p][u];
}
return t;
}
int maximumLength(string s) {
for(int i=0;i<=idx;i++)
for(int j=0;j<=26;j++)
tr[i][j] = 0;
for(int i=0;i<=idx;i++)cnt[i] = 0;
idx = 0;
char c = s[0];
int t = 1;
for(int i=1;i<s.size();i++){
if(s[i]!=c){
str = "";
while(t--)str+=c;
insert();
cout<<str<<"\n";
c = s[i];
t = 1;
}else t++;
}
str = "";
while(t--)str+=c;
insert();
cout<<str<<"\n";
int ans = 0;
for(char i='a';i<='z';i++)
ans = max(ans,find(i));
if(ans)return ans;
return -1;
}
};