NC16784. [NOIP1998]进制位
描述
输入描述
n( n ≤ 9 )表示行数。
以下n行,每行包括n个字符串,每个字串间用空格隔开。(字串仅有一个为‘+’号,其它都由大写字母组成)
输出描述
①各个字母表示什么数,格式如:L=0,K=1,……按给出的字母顺序。
②加法运算是几进制的。
③若不可能组成加法表,则应输出“ERROR!”
示例1
输入:
5 + L K V E L L K V E K K V E KL V V E KL KK E E KL KK KV
输出:
L=0 K=1 V=2 E=3 4
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 356K, 提交时间: 2018-09-09 15:19:50
#pragma GCC optmize("Ofast") #include <bits/stdc++.h> struct node { std::string s; int ans; int da; }t[10][10]; int n; std::map<char, int> a; inline std::string readString() { char buf[10]; scanf("%s", buf); return std::string(buf); } int main() { int x; scanf("%d", &n); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) t[i][j].s = readString(); for (int k = 2; k <= n; k++) { x = 0; for (int i = 2; i <= n; i++) for (int j = 2; j <= n; j++) if (t[i][j].s == t[1][k].s) x++; if (!x) return printf("ERROR!\n"), 0; t[k][1].ans = t[1][k].ans = a[t[k][1].s[0]] = x - 1; } for (int i = 2; i <= n; i++) for (int j = 2; j <= n; j++) t[i][j].ans = t[i][1].ans + t[1][j].ans; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { x = t[i][j].s.length(); if (x == 1) { t[i][j].da = a[t[i][j].s[0]]; continue; } t[i][j].da = (n - 1)*a[t[i][j].s[0]] + a[t[i][j].s[1]]; } for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (t[i][j].ans != t[i][j].da) return printf("ERROR!\n"), 0; for (int i = 2; i <= n; i++){ const char *buf = t[1][i].s.data(); printf("%s=%d ", buf, t[1][i].ans); } printf("\n%d\n", n - 1); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-02-14 12:58:02
#include<bits/stdc++.h> #define A 1000010 #define B 2010 using namespace std; typedef long long ll; int n;char a[A],re[A]; string c,cc; map<char,int> m,mm; int main() { cin>>n;cin>>c; for(int i=1;i<=n-1;i++) cin>>c,a[i]=c[0]; for(int i=1;i<=n-1;i++) for(int j=1;j<=n;j++) { cin>>c; if(j!=1 and j!=2 and c==cc) return puts("ERROR!"),0; cc=c; if(c.length()==2) m[a[i]]++,mm[c[1]]++; } for(int i=1;i<=n-1;i++) if(m[a[i]]!=n-2-mm[a[i]]) return puts("ERROR!"),0; for(int i=1;i<=n-1;i++) printf("%c=%d ",a[i],m[a[i]]);puts(" "); cout<<n-1<<endl;return 0; }