zoukankan      html  css  js  c++  java
  • 10.22 simulated match

    #include<cstdio>
    #include<cstring>
    #define init(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout); 
    using namespace std;
    int T,n,m;char s[30010],t[30010];
    int main(){init("string");
        int i,j,k,l,u;scanf("%d",&T);//read the total_num of the data
        while(T--){scanf("%s%s",&s,&t);//read the two character strings,one with *,one without *
           n=strlen(s),m=strlen(t);//mark their length separately as n and m
           for(i=j=0;i<n;i=k,j=l){u=0;//make a loop from 0 to n in order to visit every element of the string with *
              for(k=i;k<n &&(s[k]=='*'||s[k]==s[i]);k++)
              //this loop is used to find the length of *,in a section only with same lectures and *
                if(s[k]=='*')u++;//mark the length of *
              for(l=j;l<m&&t[l]==t[j];l++);//we use this loop to find out the largest same part in the string without *
              //l means the tail of the largest same part in the string without *,and j means the head
              //by this ,we think that if we can change * into that same_lecture_section   
              if(!(s[i]==t[j]&&k-i-u<=l-j&&(u||k-i==l-j)))break;
              //if the three condition are all satisfied,just break
            }i<n||j<m?printf("No
    "):printf("Yes
    ");}return 0;
            //to make a judge if it has satisfied
            //(if i<n,j<m.just means that we can't find the satisfied case during the loop,of course no solution)
            //or ,just means that it has found the satisfied case during the loop,of coursse have solution
    }

    #include<cstdio>
    using namespace std;
    int n,m,f[400010],l[100010],r[100010],x[100010],p;
    #define init(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout); 
    void add(int i,int j,int k,int l,int r,int x){if(l<=j&&k<=r)f[i]|=x;
        else{if(l<=(j+k>>1))add(i<<1,j,j+k>>1,l,r,x);
           if(r>(j+k>>1))add(i<<1|1,(j+k>>1)+1,k,l,r,x);}}
    int sum(int i,int j,int k,int l,int r){if(l<=j&&k<=r)return f[i];
        else{int p=(1<<30)-1;if(l<=(j+k>>1))p&=sum(i<<1,j,j+k>>1,l,r);
           if(r>(j+k>>1))p&=sum(i<<1|1,(j+k>>1)+1,k,l,r);
           return p;}}
    int main()
    {init("or");int i,j,k;scanf("%d%d",&n,&m);//read the length of wanted array and the total_num of conditions
        for(p=1;p<n;p<<=1);//make segment trees's N
        for(i=1;i<=m;i++)scanf("%d%d%d",&l[i],&r[i],&x[i]),x[i]^=(1<<30)-1,add(1,1,p,l[i],r[i],x[i]);
        //make a loop in order to read each conditions (a[l]|a[l-1]|...|a[r]=x)
        for(i=1;i<p;i++)f[i<<1]|=f[i],f[i<<1|1]|=f[i];//renew down(because we have change their father)
        for(i=p-1;i>0;i--)f[i]=f[i<<1]&f[i<<1|1];    for(i=1;i<=m;i++)if(sum(1,1,p,l[i],r[i])!=x[i])break;//to judge that if can satisfy each condition
        if(i<=m)printf("No
    ");//no solution case
        else{printf("Yes
    ");//have solution case
           for(i=1;i<=n;i++)printf("%d ",f[p+i-1]^(1<<30)-1);printf("
    ");//out the answer
        }return 0;}

    #include<cstdio>
    #include<algorithm>
    #define L long long
    #define O(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout); 
    #define fr(i,a,b)  for(int i=a;i<=b;i++)
    using namespace std;
    int n,m,w[100010];L s[100010];
    struct goods{int v,x;}a[100010];
    inline bool cmp(goods a,goods b){return a.v<b.v;}
    int in(){int x=0,f=1;char c=getchar();
        for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
        for(;'0'<=c&&c<='9';c=getchar())x=(x<<3)+(x<<1)+(c^48);return x*f;}
    //read optimization
    int main(){O("shop");int i,j,l,r;L k;n=in(),m=in();//read each day's goods_num and the total_num of dates 
        for(i=1;i<=n;i++)a[i].v=in(),a[i].x=in();//read each good's value and num of goods
        sort(a+1,a+n+1,cmp);//make a sort to set the array in order(increasing)
        fr(i,1,n)s[i]=s[i-1]+(L)a[i].v*a[i].x,w[i]=w[i-1]+a[i].x;//make a prefix array so that we can compare each day's buy_goods' num
        //one to make a prefix against price ,and another to make a prefix against num
        while(m--){scanf("%lld",&k);//read the total num of money
            //i:right border,j:answer,k:money
           for(i=n,j=0;i>0&&k>=a[1].v;){//make a loop ,stop condition:has not been completely visited and can afford the smallest good's price
              for(l=1,r=i;l<r;)k>=a[l+r+1>>1].v?l=(l+r+1>>1):r=(l+r+1>>1)-1;
              //make a binary search to find the largest affordable good
              i=l;if(k>=s[i]){j+=w[i];break;}//if can afford all the goods under the affordable good,just buy them all and out answer
              //or we need to use the prefix to calculate the answer
              for(l=1,r=i;l<r;)k>=s[i]-s[l+r>>1]?r=(l+r>>1):l=(l+r>>1)+1;
              //we set the last_l as the right border and 1 as the left border to make a binary search(because we can't afford the good behind)
              //make a binary search to find the largest affordable sum of goods
              k-=s[i]-s[l];j+=w[i]-w[l]+k/a[l].v;k%=a[l].v;i=l-1;}
              //just buy them and renew the money,and renew the answer
              //because we may afford the good before,so we should add the remaining affordable good,renew the money and then try to make better
              //(just set the right_border as l-1,and jump into next loop_part)
              //if out ,has two case:case 1:can afford no good ,just out 0
              //                     case 2:has calculate out the solution,just out the solution
           printf("%d
    ",j);}return 0;
    }
  • 相关阅读:
    backup-rsync主机配置
    msyqldump备份
    会话固定攻击(session fixation attack)
    正确理解 Session 的安全性
    Yii自定义辅助函数
    php缓冲机制及嵌套级别 ob_get_level
    method_exists 与 is_called
    给类动态添加新方法
    PHP Closure(闭包)类详解
    PHP Closure(闭包)类详解
  • 原文地址:https://www.cnblogs.com/muzu/p/7712153.html
Copyright © 2011-2022 走看看