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真挺好用

posted @ 2021-07-21 13:26  Johnny_12138  阅读(34)  评论(0编辑  收藏  举报