排列(permutation)
题目描述】
给定一个n*n 的矩阵f,你需要求出有多少个1~n 的排列x 满足对
于1<=i≠j<=n,均有f[i,j]=min(x[i],x[j]),并输出字典序最小的一个。
有多组数据。
【输入数据】
第一行一个整数t 表示数据组数。
每组数据第一行一个正整数n。接下来n 行每行n 个整数,第i
行第j 列的整数表示f[i,j]。
【输出数据】
对于每组数据,如果不存在这样的排列,输出一行一个整数-1。
否则输出两行,第一行一个整数表示排列个数对998244353 取模的结
果,第二行n 个整数表示字典序最小的排列。
【样例输入】
1 2
0 1
1 0
【样例输出】
2
1 2
【数据范围】
对于20%的数据,n<=8。
对于60%的数据,n<=40。
对于100%的数据,t<=10,∑n<=2000,f[i,i]=0,1<=f[i,j](i≠j)<=n。
各档数据中均有一半保证全部有解。
字符串(string)
【题目描述】
定义两个字符串A,B 相似当且仅当满足以下两个条件中的至少一
个:
(1)A 和B 相同;
(2)将A 分为长度相同的两个子串A0,A1,将B 分为长度相同的两
个子串B0,B1,满足A0 相似于B0,A1 相似于B1 或A0 相似于B1,
A1 相似于B0。
给定两个字符串S,T,问它们是否相似。
有多组数据。
【输入数据】
第一行一个整数t 表示数据组数。
每组数据第一行一个字符串S,第二行一个字符串T,保证它们
长度相同。
【输出数据】
每组数据一行,若相似输出YES,不相似输出NO。
【样例输入】
2
abab
baab
aabb
abab
【样例输出】
YES
NO
【数据范围】
对于30%的数据,|S|<=30。
对于60%的数据,|S|<=100。
对于100%的数据,t<=30,∑|S|<=500000。
数(number)
【题目描述】
给定正整数n,m,问有多少个正整数满足:
(1)不含前导0;
(2)是m 的倍数;
(3)可以通过重排列各个数位得到n。
【输入数据】
一行两个整数n,m。
【输出数据】
一行一个整数表示答案对998244353 取模的结果。
【样例输入】
1 1
【样例输出】
1
【数据范围】
对于20%的数据,n<10^10。
对于50%的数据,n<10^16,m<=20。
对于100%的数据,n<10^20,m<=100。
就这样三道题,我也不知道说些sm好,第一题死磕半天,埃,最后还不知道正确性,
脑子是越来越没用了,不开窍的时候sm都想不出来,不知道怎么办好,
第一题搞了半天,打到10点半,剩下就一个小时第二第三题,然后都写了写暴力。
这次为什么这么差,原因在于:
- 开始没有先将题目看完。
- 第一题复杂化,没有换种思路,死磕。
- 没有很好的心态,和做题太少。
- 草稿纸不够。
- 错误方法还去实现,浪费大量时间。
还好这次不是提高组,不然绝对挂惨,幸运的是提前发现了错误,可以总结许多,学会许多。
T1:就是每次找当前这一行的最大上界,就是a1,
然后按这样方法,找a2,。。。,an为止,特判1情况,然后没了。
T2:暴力,自己傻傻没开大数据范围。
T3:数位dp
下面是第一次的代码
T1
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define N 2007 7 #define LL long long 8 #define mod 998244353 9 using namespace std; 10 11 int n,cnt; 12 int a[N][N]; 13 int boo[N],ans[N],ckt[N]; 14 15 struct Node 16 { 17 int l,r,num; 18 }tr[N]; 19 20 LL PL(int x) 21 { 22 LL res=1; 23 for (int i=1;i<=x;i++) 24 res=res*i%mod; 25 return res; 26 } 27 int main() 28 { 29 freopen("permutation.in","r",stdin); 30 freopen("permutation.out","w",stdout); 31 32 int cas;scanf("%d",&cas); 33 while(cas--) 34 { 35 scanf("%d",&n); 36 for (int i=1;i<=n;i++) 37 for (int j=1;j<=n;j++) 38 scanf("%d",&a[i][j]); 39 bool flag=false; 40 for (int i=1;i<=n;i++) 41 for (int j=i+1;j<=n;j++) 42 if (a[i][j]!=a[j][i]) 43 { 44 flag=true; 45 break; 46 } 47 if (flag) 48 { 49 printf("-1\n"); 50 continue; 51 } 52 for (int i=1;i<=n;i++) 53 boo[i]=1; 54 for (int i=1;i<=n;i++) 55 for (int j=i+1;j<=n;j++) 56 boo[i]=max(boo[i],a[i][j]),boo[j]=max(boo[j],a[i][j]); 57 58 memset(ckt,0,sizeof(ckt)); 59 int zhi[N]={0}; 60 for (int i=1;i<=n;i++) 61 zhi[boo[i]]++; 62 for (int i=1;i<=n-2;i++) 63 if (zhi[i]!=1) 64 { 65 flag=1; 66 } 67 if (zhi[n]==2) flag=1; 68 for (int i=1;i<=n;i++) 69 { 70 int fzy=0; 71 for (int j=boo[i];j<=n;j++) 72 if (ckt[j]==0) 73 { 74 ckt[j]=1; 75 ans[i]=j; 76 fzy=1; 77 break; 78 } 79 if (!fzy) 80 { 81 flag=1; 82 break; 83 } 84 } 85 if (flag) printf("-1\n"); 86 else 87 { 88 int fzy=0; 89 for (int i=1;i<=n;i++) 90 if(boo[i]==n) 91 { 92 fzy=1; 93 break; 94 } 95 if (fzy==0) cout<<2<<endl; 96 else cout<<1<<endl; 97 for (int i=1;i<n;i++) 98 cout<<ans[i]<<" "; 99 cout<<ans[n]<<endl; 100 } 101 } 102 }
T2
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cmath> 5 #include<cstring> 6 7 using namespace std; 8 9 char c1[107],c2[107]; 10 11 bool dfs(int l1,int r1,int l2,int r2) 12 { 13 int flag=0; 14 for (int i=0;i<=r1-l1;i++) 15 if (c1[i+l1]!=c2[i+l2]) 16 { 17 flag=1; 18 break; 19 } 20 if (!flag) return true; 21 if (l1==r1||(r1-l1+1)%2==1) return false; 22 int up=(r1-l1)/2; 23 if (dfs(l1,l1+up,l2,l2+up)&&dfs(l1+up+1,r1,l2+up+1,r2)) return true; 24 if (dfs(l1,l1+up,r2-up,r2)&&dfs(l1+up+1,r1,l2,r2-up-1)) return true; 25 return false; 26 } 27 int main() 28 { 29 freopen("string.in","r",stdin); 30 freopen("string.out","w",stdout); 31 32 int cas;scanf("%d",&cas); 33 while (cas--) 34 { 35 scanf("%s%s",c1,c2); 36 int len=strlen(c1); 37 for (int i=len;i>=1;i--) 38 c1[i]=c1[i-1],c2[i]=c2[i-1]; 39 if (dfs(1,len,1,len)) printf("YES\n"); 40 else printf("NO\n"); 41 } 42 }
T3
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 #include<map> 7 #define LL long long 8 9 using namespace std; 10 11 map<LL,bool>p; 12 13 LL n,m,cnt,ans; 14 LL a[107],boo[107]; 15 16 void dfs(LL now,int ci) 17 { 18 if (ci==cnt) 19 { 20 if (now%m==0) 21 { 22 if (!p[now]) ans++; 23 p[now]=1; 24 } 25 return; 26 } 27 for (int i=1;i<=cnt;i++) 28 if (!boo[i]) 29 { 30 if (now==0&&a[i]==0) continue; 31 boo[i]=1; 32 dfs(now*10+a[i],ci+1); 33 boo[i]=0; 34 } 35 } 36 int main() 37 { 38 freopen("number.in","r",stdin); 39 freopen("number.out","w",stdout); 40 41 scanf("%lld%lld",&n,&m); 42 cnt=0; 43 while(n) 44 { 45 a[++cnt]=n%10; 46 n/=10; 47 } 48 ans=0; 49 memset(boo,0,sizeof(boo)); 50 dfs(0,0); 51 printf("%lld",ans); 52 }
对于这么一个特别的日子,没考好真的。。。。