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;
    }
  • 相关阅读:
    poj 1860 Currency Exchange(最短路径的应用)
    poj 2965 The Pilots Brothers' refrigerator
    zoj 1827 the game of 31 (有限制的博弈论)
    poj 3295 Tautology (构造法)
    poj 1753 Flip Game(枚举)
    poj 2109 (贪心)
    poj 1328(贪心)
    Qt 对单个控件美化
    Qt 4基础
    Bash Shell
  • 原文地址:https://www.cnblogs.com/muzu/p/7712153.html
Copyright © 2011-2022 走看看