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三题给看一遍,然后找点题巩固一下。