A
总结
- bkdr hash
seed=7,17,131…
mod=1e9+7
unsigned int bkdrHash(string s){
unsigned int hash=0,seed=131,mod=1e9+7,tmp=seed;
int n=s.size();
for(int i=0;i<n;i++){
unsigned int as=s[i];
hash+=as*tmp%mod;
tmp*=seed;
}
return hash;
}
- 注意输入必须用getline,spell和function都可能有空格
代码
#include<iostream>
#include<string>
#include<map>
#include<cmath>
#include<vector>
using namespace std;
map<unsigned int,int> spell,func;
vector<string> spls,fcs;
string s,spl,fc;
int r,l,N;
unsigned int bkdrHash(string s){
unsigned int hash=0,seed=131,mod=1e9+7,tmp=seed;
int n=s.size();
for(int i=0;i<n;i++){
unsigned int as=s[i];
hash+=as*tmp%mod;
tmp*=seed;
}
return hash;
}
int main(void){
int index=0;
while(1){
getline(cin,s);
if(s=="@END@") break;
l=s.find('['), r=s.find(']');
spl=s.substr(l+1,r-l-1);
fc=s.substr(r+2,s.size()-r);
spls.push_back(spl);
fcs.push_back(fc);
unsigned int sHash=bkdrHash(spl);
unsigned int fHash=bkdrHash(fc);
spell[sHash]=index;
func[fHash]=index;
index++;
}
cin>>N;
getchar();
while(N--){
getline(cin,s);
if(s[0]=='[')
s=s.substr(1,s.size()-2);
unsigned int tmp=bkdrHash(s);
if(spell.find(tmp)!=spell.end())
cout<<fcs[spell[tmp]]<<endl;
else if(func.find(tmp)!=func.end())
cout<<spls[func[tmp]]<<endl;
else
cout<<"what?"<<endl;
}
return 0;
}
B
总结
字典树
叶子节点与字符串数相等则存在
代码
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
using namespace std;
vector<string> vctr;
struct Trie{
static const int N=1010,charset=2;
int tot,root,child[N][charset],flag[N];
Trie(){
tot=root=0;
memset(child,-1,sizeof(child));
}
void insert(string &s){
int now=root;
for(int i=0;i<s.size();i++){
int asc=s[i]-'0';
if(child[now][asc]==-1){
child[now][asc]=++tot;
flag[now]=0;
}
now=child[now][asc];
}
flag[now]=1;
}
int leaves(int now){
if(child[now][0]==-1&&child[now][1]==-1)
return 1;
int x=0;
for(int i=0;i<charset;i++){
if(child[now][i]!=-1)
x+=leaves(child[now][i]);
}
return x;
}
};
int main(void){
string tmp;
for(int i=1;cin>>tmp;i++){
vctr.clear();
Trie trie;
if(tmp=="9") break;
trie.insert(tmp);
vctr.push_back(tmp);
while(cin>>tmp){
if(tmp=="9") break;
trie.insert(tmp);
vctr.push_back(tmp);
}
int a=trie.leaves(0);
if(a==vctr.size())
cout<<"Set "<<i<<" is immediately decodable"<<endl;
else
cout<<"Set "<<i<<" is not immediately decodable"<<endl;
}
return 0;
}
C
总结
KMP算法
代码