Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- long long h[50100][20], s[20], B=3137;
- int n;
- string a[50100];
- long long f(int x, int y, int p)
- {
- long long t=0;
- if (x) t=h[p][x-1]*s[y];
- return h[p][x+y-1]-t;
- }
- int sz=0, next[700000][27], val[700000];
- void ubaci(string s)
- {
- int v=0;
- for (int i=0;i<(int)s.size();i++) {
- if (next[v][s[i]-'a']) v=next[v][s[i]-'a'];
- else {
- sz++;
- next[v][s[i]-'a']=sz;
- v=sz;
- }
- val[v]++;
- }
- return;
- }
- int nadi(string s)
- {
- int v=0;
- for (int i=0;i<(int)s.size();i++) {
- if (!next[v][s[i]-'a']) return 0;
- v=next[v][s[i]-'a'];
- }
- return val[v];
- }
- int main()
- {
- cin >> n;
- for (int i=0;i<n;i++) {
- cin >> a[i];
- h[i][0]=a[i][0];
- }
- s[0]=1;
- for (int i=1;i<20;i++) {
- s[i]=s[i-1]*B;
- }
- for (int i=0;i<n;i++) {
- for (int j=1;j<(int)a[i].size();j++) {
- h[i][j]=h[i][j-1]*B+a[i][j];
- }
- }
- for (int i=0;i<n;i++) {
- ubaci(a[i]);
- }
- long long rj=0;
- for (int i=0;i<n;i++) {
- for (int j=0;j<(int)a[i].size();j++) {
- for (int k=0;k<j;k++) {
- if (f((int)a[i].size()-1-k,k+1,i)==f((int)a[i].size()-1-j,k+1,i)) goto izlaz;
- }
- rj+=nadi(a[i].substr((int)a[i].size()-1-j,j+1));
- if (f(0,j+1,i)==f((int)a[i].size()-1-j,j+1,i)) rj--;
- izlaz:;
- }
- }
- cout << rj;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement