HNU湖南大学第三次作业
Summary
T1 部分A+B
展开查看代码
#include
#include
#include
#include
using namespace std;
#define ll long long
int main (){
// freopen("1.in","r",stdin);
string s1,s2,a,b;
cin>>s1>>a>>s2>>b;
int num1=0,num2=0;
for(int i=0;iint x=0,y=0;
for(int i=1;i<=num1;i++){
x*=10;
x+=a[0]-'0';
}
for(int i=1;i<=num2;i++){
y*=10;
y+=b[0]-'0';
}
cout<<x+y<<endl;
return 0;
}
T2 导弹拦截
n<=25,可以直接裸dfs(doge)
n<=5000,可以试试记忆化搜索或者dp(没试doge)
n<=1e7这个数量级,可以搞一搞O(nlogn)这个算法\
dfs:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
int a[1000];
int n,m,maxn;
void dfs(int x,int las,int k){
if(x==n+1){
maxn=max(k,maxn);
return;
}
if(a[x]>las){
dfs(x+1,las,k);
return;
}
dfs(x+1,a[x],k+1);
dfs(x+1,las,k);
}
int main (){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
maxn=0;
dfs(1,999999999,0);
cout<<maxn<<endl;
return 0;
}
NlogN
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
int k[500000],arr[500000];
int main (){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>arr[i];
int ans=0;
for(int i=1,j;i<=n;i++)
{
j=(int)(upper_bound(k+1,k+1+ans,arr[i],greater<int>())-k);//greater是递减序列
ans=max(ans,j);
k[j]=arr[i];
}
cout<<ans<<endl;
return 0;
}
T3 魔咒字典
代码有亿点长
需要用字符串哈希
如一个字符串s,hash值可以这么求
(利用了unsigned long long 的自然溢出)
#define ull unsigned long long
ull p1=100663319;
ull HASH(string s){
ull ans=0;
for(int i=0;i<s.length();i++)
ans=ans*p1+s[i];
return ans;
}
把hash值都求出来,最后就是直接暴力比较了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<sstream>
#include<map>
#include<vector>
using namespace std;
#define ull unsigned long long
ull p1=100663319;
int n=0;
ull spel[100000+5][21],func[100000+5][81],a[81];
string spell[100000+5][21],function[100000+5][81];
ull HASH(string s){
ull ans=0;
for(int i=0;i<s.length();i++)
ans=ans*p1+s[i];
return ans;
}
void init(){
while(1){
stringstream ss;
string s;
getline(cin,s);ss<<s;
ss>>s;
if(s=="@END@") break;
n++;
while(1){
spel[n][++spel[n][0]]=HASH(s);//spel存hash值
spell[n][spel[n][0]]=s;//spell存原有字符串
if(s[s.length()-1]==']') break;
ss>>s;
}
while(ss>>s){
func[n][++func[n][0]]=HASH(s);//func存hash值
function[n][func[n][0]]=s;
}
}
}
void sol(){
int m;
cin>>m;
string s;
getline(cin,s);
while(m--){
string s;
stringstream ss;
getline(cin,s);ss<<s;
ss>>s;
//求询问字符串的hash值
int op=s[0]=='['?1:0;
int len=1;a[len]=HASH(s);
while(ss>>s){
a[++len]=HASH(s);
}
//开始暴力比较
if(op){
int flag=0,k;
for(int i=1;i<=n;i++){
if(len!=spel[i][0]) continue;
int flag2=0;
for(int j=1;j<=spel[i][0];j++)
if(spel[i][j]!=a[j]){
flag2=1;
break;
}
if(!flag2){
k=i;flag=1;
break;
}
}
if(!flag){
cout<<"what?"<<endl;
}
else{
for(int i=1;i<=func[k][0];i++)
cout<<function[k][i]<<" ";
cout<<endl;
}
}
else{
int flag=0,k;
for(int i=1;i<=n;i++){
if(len!=func[i][0]) continue;
int flag2=0;
for(int j=1;j<=func[i][0];j++)
if(func[i][j]!=a[j]){
flag2=1;
break;
}
if(!flag2){
k=i;
flag=1;
break;
}
}
if(!flag){
cout<<"what?"<<endl;
}
else{
for(int i=1;i<=spel[k][0];i++){
for(int j=0;j<spell[k][i].length();j++){
if(spell[k][i][j]=='['||spell[k][i][j]==']')
continue;
cout<<spell[k][i][j];
}
cout<<" ";
}
cout<<endl;
}
}
}
}
int main (){
init();
sol();
return 0;
}
u1s1,stringstream真挺好用