AcWing 831. KMP字符串
1.题意:
2.题解:
3.ac代码:
#include<stdio.h>
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
const int N=100010,M=1000100;
char p[N],s[M];
int ne[N];
int main(){
int n,m;
cin>>n>>p+1>>m>>s + 1;
for(int i=2,j=0;i<=n;i++){
while(j&&p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1])
j++;
ne[i]=j;
}
for(int i=1,j=0;i<=m;i++){
while(j&&s[i]!=p[j+1]) j=ne[j];
if(s[i]==p[j+1]) j++;
if(j==n){
cout<<i-n<<" ";
}
}
cout<<endl;
}
AcWing 835. Trie字符串统计
1.题意:
2.题解:
3.ac代码:
#include<stdio.h>
#include<bits/stdc++.h>
#include<string>
using namespace std;
const int N=2e4+10;
int n,x,idx;
string str;
char op;
int s[N][26];
int cnt[N];
void insert(string str){
int next_pos=0;
for(int i=0;i<str.size();i++){
int u=str[i]-'a';
if(!s[next_pos][u]) s[next_pos][u]=++idx;
next_pos=s[next_pos][u];
}
cnt[next_pos]++;
}
void query(string str){
int next_pos=0;
for(int i=0;i<str.size();i++){
int u=str[i]-'a';
if(!s[next_pos][u]){
cout<<0<<endl;
return ;
}else{
next_pos=s[next_pos][u];
}
}
cout<<cnt[next_pos]<<endl;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>op>>str;
if(op=='I'){
insert(str);
}else{
query(str);
}
}
}
AcWing 143. 最大异或对
1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=31*N;
int son[M][2];
int idx;
void insert(int x){
int next_pos=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(!son[next_pos][u]) son[next_pos][u]=++idx;
next_pos=son[next_pos][u];
}
}
int query(int x){
int next_pos=0;
int res=0;
for(int i=30;i>=0;i--){
int u=x>>i&1;
if(son[next_pos][!u]){
next_pos=son[next_pos][!u];
res=res*2 +!u;
}else{
next_pos=son[next_pos][u];
res=res*2 + u;
}
}
return res;
}
int main(){
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
insert(x);
int res=query(x);
ans=max(ans,res^x);
}
cout<<ans<<endl;
}