AB水

补了C

#include <stdio.h>
#define MAXN 1500
int  MOD=1e9+7;
char str[MAXN];
int cnt[50];
int dp[MAXN];
int minn[MAXN];
int min(int a,int b)
{
if(a<b)return a;
elsereturn b;
}
int max(int a, int b)
{
if(a>b) return a;
else return b;
}
int main(void)
{
int n;
scanf("%d",&n);
int maxx=0;
scanf("%s",str+1);
for(int i=1;i<=26;i++)
scanf("%d",&cnt[i]);
dp[0]=1;
for(int i=1;i<=n;i++)
minn[i]=MAXN;
for(int i=1;i<=n;i++)
{
int temp=MAXN;
for(int j=i;j>=1;j--)
{
int nj=str[j]-'a'+1;
temp=min(temp,cnt[nj]);
if(temp >= i-j+1)
{
dp[i]=(dp[i]+dp[j-1]) % MOD;
maxx=max(maxx,i-j+1);
minn[i]=min(minn[i],minn[j-1]+1);
}
else break;
}
}
printf("%d\n%d\n%d\n",dp[n],maxx,minn[n]);
}

2017/7/3  还有地方不是理解,得继续看。希望今天能把DE两题给补了


D:   // 学习了使用MAP容器进行等价HASH的方法,这题帮助很大,一来是信心建立,之前一直都很怕这个题。 计划: 明天翻开原来的并查集,做一道类似的题,确保自己可以做出来。 加油!!!!

#include <stdio.h>
#include <map>
#include <string>
#include <string.h>
#include <iostream>
#define MAXN 100000+5
using namespace std;
int r[MAXN];
map<string,int> M;
int a;
int pa[MAXN];
int  find(int x)     //这里比较关键,还需要理解
{
    if(pa[x]==x) return x;
    int rx=pa[x];
    pa[x]=find(pa[x]);
    r[x]=(r[x]+r[rx])%2;
    return pa[x];
}
void init()
{
    for(int i=1;i<=MAXN-1;i++)
    pa[i]=i,r[i]=0;
}
void unit(int x,int y)   // 如果不同根,那一定YES;如果同根: 那么判断(r[x]-r[y]和0的关系),如果相同,YES;不同说明是1的关系。
{
    int rx=find(x);
    int ry=find(y);
    //printf("%d&&%d",rx,ry);
    if(rx==ry)
    {
    int ans=(r[x]-r[y]+2)%2;
    if(ans==a-1) printf("YES\n");
    else printf("NO\n");
    //printf("%d",ans);
    return ;
}
else
{
    pa[ry]=rx;
    r[ry]=((a-1)+r[x]-r[y]+2)%2;
    printf("YES\n");
    return ;
    }
}
int main(void)
{
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)
    {
        string s;
        cin >> s;
        M[s]=i;
    }
    init();
    while(m--)
    {
        string s1,s2;
        cin >> a >> s1 >> s2;
        unit(M[s1],M[s2]);
    }
    while(q--)
    {
        string s1,s2;
        cin >> s1 >> s2;
        int x1=M[s1],x2=M[s2];
        if(find(x1)==find(x2))
        {
            if(r[x1]==r[x2])printf("1\n");
            else printf("2\n");
        }
        else
        printf("3\n");
    }
}


2017.7.2

呱呱呱~晚上还想把E题补掉,明天花半天时间把CDE三题给看一遍,然后找点题巩固一下。