#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define fore(i,a,b) for(ll i=a,isudgh=b;i<isudgh;i++)
#define SZ(x) ((int)(x).size())
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset((a),(v),sizeof(a))
#define imp(v) {for(auto jhglkdfjg:v)cout<<jhglkdfjg<<" ";cout<<"\n";}
#define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
const ll MOD=998244353,MAXA=62;
ll add(ll a, ll b){a+=b;if(a>=MOD)a-=MOD;return a;}
ll sub(ll a, ll b){a-=b;if(a<0)a+=MOD;return a;}
ll mul(ll a, ll b){return a*b%MOD;}
ll A; //alphabet
vector<vector<ll>> q,g={
{},
{0},
{0},
{0},
{1,2},
{1,3},
{2,3},
{4,5,6}
};
vector<ll>bor={0,0,0,1,0,1,2,4},tam={1,2,3,3,4,4,3,0};
vector<ll>pot(6);
vector<ll>dp[8];
ll get(ll i, ll j, ll h){
ll p=i-1-j;
ll ret=h/pot[p]%A;
// cout<<"get "<<i<<" "<<j<<" "<<h<<": "<<p<<": "<<ret<<"\n";
return ret;
}
ll go(ll i, ll h, ll c){
return (h*A+c)%pot[tam[i]];
}
vector<ii>vis;
ll f(ll i, ll h){
if(i==8)return 1;
ll &res=dp[i][h];
if(res!=-1)return res;
res=0;
vis.pb({i,h});
fore(c,0,A){// pongo c
ll resi=1;
for(auto j:g[i]){
ll d=get(i,j,h);
resi=mul(resi,q[c][d]);
}
// cout<<i<<""
if(resi)res=add(res,mul(resi,f(i+1,go(i,h,c))));
}
// cout<<i<<" "<<h<<": "<<res<<"\n";
return res;
}
ll solve(vector<string>&a){
// cout<<"solve "; imp(a);
ll n=SZ(a);
vector<char>c;
fore(i,0,n)c.pb(a[i][0]),c.pb(a[i].back());
sort(ALL(c));
vector<char> ci;
fore(i,0,SZ(c))if(!i||c[i]!=c[i-1])ci.pb(c[i]);
c=ci;
for(auto &s:a){
auto change=[&](char &j){
ll p=lower_bound(ALL(c),j)-c.begin();
j=p;
};
change(s[0]); change(s.back());
}
// imp(a);
A=SZ(c);
q=vector<vector<ll>>(A,vector<ll>(A));
set<string> st[A][A];
for(auto s:a){
st[s[0]][s.back()].insert(s);
reverse(ALL(s));
st[s[0]][s.back()].insert(s);
}
fore(i,0,A)fore(j,0,A)q[i][j]=SZ(st[i][j]);
/*fore(i,0,A){
imp(q[i]);
}*/
pot[0]=1;
fore(i,1,6)pot[i]=pot[i-1]*A;
ll res=f(0,0);
for(auto [i,j]:vis)dp[i][j]=-1;
vis.clear();
return res;
}
const ll MAXV=1e5+5;
int main(){FIN;
ll n; cin>>n;
vector<string> b[MAXV];
fore(i,0,n){
string s;cin>>s;
b[SZ(s)].pb(s);
}
vector<ll>POT={1};
fore(i,0,5)POT.pb(POT.back()*MAXA);
fore(i,0,8){
dp[i]=vector<ll>(POT[(i?tam[i-1]:0)],-1);
// cout<<i<<": "<<SZ(dp[i])<<"\n";
}
// imp(POT); cout<<endl;
ll res=0;
fore(i,0,MAXV){
res=add(res,solve(b[i]));
}
// res=solve(b[5]);
cout<<res<<"\n";
return 0;
}
Compilation message
cubeword.cpp: In function 'll solve(std::vector<std::__cxx11::basic_string<char> >&)':
cubeword.cpp:85:10: warning: array subscript has type 'char' [-Wchar-subscripts]
85 | st[s[0]][s.back()].insert(s);
| ^
cubeword.cpp:85:18: warning: array subscript has type 'char' [-Wchar-subscripts]
85 | st[s[0]][s.back()].insert(s);
| ~~~~~~^~
cubeword.cpp:87:10: warning: array subscript has type 'char' [-Wchar-subscripts]
87 | st[s[0]][s.back()].insert(s);
| ^
cubeword.cpp:87:18: warning: array subscript has type 'char' [-Wchar-subscripts]
87 | st[s[0]][s.back()].insert(s);
| ~~~~~~^~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
94 ms |
246004 KB |
Output is correct |
2 |
Correct |
90 ms |
245840 KB |
Output is correct |
3 |
Correct |
100 ms |
246124 KB |
Output is correct |
4 |
Correct |
89 ms |
246132 KB |
Output is correct |
5 |
Correct |
91 ms |
246020 KB |
Output is correct |
6 |
Correct |
89 ms |
245992 KB |
Output is correct |
7 |
Correct |
98 ms |
245892 KB |
Output is correct |
8 |
Correct |
92 ms |
245856 KB |
Output is correct |
9 |
Correct |
80 ms |
245836 KB |
Output is correct |
10 |
Correct |
96 ms |
245948 KB |
Output is correct |
11 |
Correct |
91 ms |
245840 KB |
Output is correct |
12 |
Correct |
89 ms |
246052 KB |
Output is correct |
13 |
Correct |
92 ms |
246016 KB |
Output is correct |
14 |
Correct |
85 ms |
246056 KB |
Output is correct |
15 |
Correct |
84 ms |
246052 KB |
Output is correct |
16 |
Correct |
85 ms |
245844 KB |
Output is correct |
17 |
Correct |
91 ms |
246056 KB |
Output is correct |
18 |
Correct |
90 ms |
246012 KB |
Output is correct |
19 |
Correct |
90 ms |
245984 KB |
Output is correct |
20 |
Correct |
102 ms |
245960 KB |
Output is correct |
21 |
Correct |
91 ms |
245844 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
94 ms |
246004 KB |
Output is correct |
2 |
Correct |
90 ms |
245840 KB |
Output is correct |
3 |
Correct |
100 ms |
246124 KB |
Output is correct |
4 |
Correct |
89 ms |
246132 KB |
Output is correct |
5 |
Correct |
91 ms |
246020 KB |
Output is correct |
6 |
Correct |
89 ms |
245992 KB |
Output is correct |
7 |
Correct |
98 ms |
245892 KB |
Output is correct |
8 |
Correct |
92 ms |
245856 KB |
Output is correct |
9 |
Correct |
80 ms |
245836 KB |
Output is correct |
10 |
Correct |
96 ms |
245948 KB |
Output is correct |
11 |
Correct |
91 ms |
245840 KB |
Output is correct |
12 |
Correct |
89 ms |
246052 KB |
Output is correct |
13 |
Correct |
92 ms |
246016 KB |
Output is correct |
14 |
Correct |
85 ms |
246056 KB |
Output is correct |
15 |
Correct |
84 ms |
246052 KB |
Output is correct |
16 |
Correct |
85 ms |
245844 KB |
Output is correct |
17 |
Correct |
91 ms |
246056 KB |
Output is correct |
18 |
Correct |
90 ms |
246012 KB |
Output is correct |
19 |
Correct |
90 ms |
245984 KB |
Output is correct |
20 |
Correct |
102 ms |
245960 KB |
Output is correct |
21 |
Correct |
91 ms |
245844 KB |
Output is correct |
22 |
Correct |
345 ms |
249164 KB |
Output is correct |
23 |
Correct |
343 ms |
248352 KB |
Output is correct |
24 |
Correct |
314 ms |
248536 KB |
Output is correct |
25 |
Correct |
331 ms |
249272 KB |
Output is correct |
26 |
Correct |
326 ms |
247928 KB |
Output is correct |
27 |
Correct |
348 ms |
248552 KB |
Output is correct |
28 |
Correct |
338 ms |
249232 KB |
Output is correct |
29 |
Correct |
356 ms |
247604 KB |
Output is correct |
30 |
Correct |
323 ms |
248932 KB |
Output is correct |
31 |
Correct |
344 ms |
247572 KB |
Output is correct |
32 |
Correct |
375 ms |
248084 KB |
Output is correct |
33 |
Correct |
357 ms |
249168 KB |
Output is correct |
34 |
Correct |
354 ms |
248840 KB |
Output is correct |
35 |
Correct |
346 ms |
249120 KB |
Output is correct |
36 |
Correct |
323 ms |
247640 KB |
Output is correct |
37 |
Correct |
343 ms |
248164 KB |
Output is correct |
38 |
Correct |
362 ms |
249228 KB |
Output is correct |
39 |
Correct |
341 ms |
247628 KB |
Output is correct |
40 |
Correct |
354 ms |
248668 KB |
Output is correct |
41 |
Correct |
349 ms |
248804 KB |
Output is correct |
42 |
Correct |
345 ms |
249340 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
94 ms |
246004 KB |
Output is correct |
2 |
Correct |
90 ms |
245840 KB |
Output is correct |
3 |
Correct |
100 ms |
246124 KB |
Output is correct |
4 |
Correct |
89 ms |
246132 KB |
Output is correct |
5 |
Correct |
91 ms |
246020 KB |
Output is correct |
6 |
Correct |
89 ms |
245992 KB |
Output is correct |
7 |
Correct |
98 ms |
245892 KB |
Output is correct |
8 |
Correct |
92 ms |
245856 KB |
Output is correct |
9 |
Correct |
80 ms |
245836 KB |
Output is correct |
10 |
Correct |
96 ms |
245948 KB |
Output is correct |
11 |
Correct |
91 ms |
245840 KB |
Output is correct |
12 |
Correct |
89 ms |
246052 KB |
Output is correct |
13 |
Correct |
92 ms |
246016 KB |
Output is correct |
14 |
Correct |
85 ms |
246056 KB |
Output is correct |
15 |
Correct |
84 ms |
246052 KB |
Output is correct |
16 |
Correct |
85 ms |
245844 KB |
Output is correct |
17 |
Correct |
91 ms |
246056 KB |
Output is correct |
18 |
Correct |
90 ms |
246012 KB |
Output is correct |
19 |
Correct |
90 ms |
245984 KB |
Output is correct |
20 |
Correct |
102 ms |
245960 KB |
Output is correct |
21 |
Correct |
91 ms |
245844 KB |
Output is correct |
22 |
Correct |
345 ms |
249164 KB |
Output is correct |
23 |
Correct |
343 ms |
248352 KB |
Output is correct |
24 |
Correct |
314 ms |
248536 KB |
Output is correct |
25 |
Correct |
331 ms |
249272 KB |
Output is correct |
26 |
Correct |
326 ms |
247928 KB |
Output is correct |
27 |
Correct |
348 ms |
248552 KB |
Output is correct |
28 |
Correct |
338 ms |
249232 KB |
Output is correct |
29 |
Correct |
356 ms |
247604 KB |
Output is correct |
30 |
Correct |
323 ms |
248932 KB |
Output is correct |
31 |
Correct |
344 ms |
247572 KB |
Output is correct |
32 |
Correct |
375 ms |
248084 KB |
Output is correct |
33 |
Correct |
357 ms |
249168 KB |
Output is correct |
34 |
Correct |
354 ms |
248840 KB |
Output is correct |
35 |
Correct |
346 ms |
249120 KB |
Output is correct |
36 |
Correct |
323 ms |
247640 KB |
Output is correct |
37 |
Correct |
343 ms |
248164 KB |
Output is correct |
38 |
Correct |
362 ms |
249228 KB |
Output is correct |
39 |
Correct |
341 ms |
247628 KB |
Output is correct |
40 |
Correct |
354 ms |
248668 KB |
Output is correct |
41 |
Correct |
349 ms |
248804 KB |
Output is correct |
42 |
Correct |
345 ms |
249340 KB |
Output is correct |
43 |
Execution timed out |
1170 ms |
310924 KB |
Time limit exceeded |
44 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
94 ms |
246004 KB |
Output is correct |
2 |
Correct |
90 ms |
245840 KB |
Output is correct |
3 |
Correct |
100 ms |
246124 KB |
Output is correct |
4 |
Correct |
89 ms |
246132 KB |
Output is correct |
5 |
Correct |
91 ms |
246020 KB |
Output is correct |
6 |
Correct |
89 ms |
245992 KB |
Output is correct |
7 |
Correct |
98 ms |
245892 KB |
Output is correct |
8 |
Correct |
92 ms |
245856 KB |
Output is correct |
9 |
Correct |
80 ms |
245836 KB |
Output is correct |
10 |
Correct |
96 ms |
245948 KB |
Output is correct |
11 |
Correct |
91 ms |
245840 KB |
Output is correct |
12 |
Correct |
89 ms |
246052 KB |
Output is correct |
13 |
Correct |
92 ms |
246016 KB |
Output is correct |
14 |
Correct |
85 ms |
246056 KB |
Output is correct |
15 |
Correct |
84 ms |
246052 KB |
Output is correct |
16 |
Correct |
85 ms |
245844 KB |
Output is correct |
17 |
Correct |
91 ms |
246056 KB |
Output is correct |
18 |
Correct |
90 ms |
246012 KB |
Output is correct |
19 |
Correct |
90 ms |
245984 KB |
Output is correct |
20 |
Correct |
102 ms |
245960 KB |
Output is correct |
21 |
Correct |
91 ms |
245844 KB |
Output is correct |
22 |
Correct |
345 ms |
249164 KB |
Output is correct |
23 |
Correct |
343 ms |
248352 KB |
Output is correct |
24 |
Correct |
314 ms |
248536 KB |
Output is correct |
25 |
Correct |
331 ms |
249272 KB |
Output is correct |
26 |
Correct |
326 ms |
247928 KB |
Output is correct |
27 |
Correct |
348 ms |
248552 KB |
Output is correct |
28 |
Correct |
338 ms |
249232 KB |
Output is correct |
29 |
Correct |
356 ms |
247604 KB |
Output is correct |
30 |
Correct |
323 ms |
248932 KB |
Output is correct |
31 |
Correct |
344 ms |
247572 KB |
Output is correct |
32 |
Correct |
375 ms |
248084 KB |
Output is correct |
33 |
Correct |
357 ms |
249168 KB |
Output is correct |
34 |
Correct |
354 ms |
248840 KB |
Output is correct |
35 |
Correct |
346 ms |
249120 KB |
Output is correct |
36 |
Correct |
323 ms |
247640 KB |
Output is correct |
37 |
Correct |
343 ms |
248164 KB |
Output is correct |
38 |
Correct |
362 ms |
249228 KB |
Output is correct |
39 |
Correct |
341 ms |
247628 KB |
Output is correct |
40 |
Correct |
354 ms |
248668 KB |
Output is correct |
41 |
Correct |
349 ms |
248804 KB |
Output is correct |
42 |
Correct |
345 ms |
249340 KB |
Output is correct |
43 |
Execution timed out |
1170 ms |
310924 KB |
Time limit exceeded |
44 |
Halted |
0 ms |
0 KB |
- |