foo.cpp: In member function 'StringHash::Hash& StringHash::Hash::operator*=(int)':
foo.cpp:39:51: warning: no return statement in function returning non-void [-Wreturn-type]
inline Hash&operator*=(int x){a*=x;b=(ull)b*x%P;}
^
foo.cpp: In member function 'StringHash::Hash& StringHash::Hash::operator*=(const StringHash::Hash&)':
foo.cpp:40:62: warning: no return statement in function returning non-void [-Wreturn-type]
inline Hash&operator*=(const Hash&x){a*=x.a;b=(ull)b*x.b%P;}
^
foo.cpp: In member function 'StringHash::Hash& StringHash::Hash::operator+=(int)':
foo.cpp:41:55: warning: no return statement in function returning non-void [-Wreturn-type]
inline Hash&operator+=(int x){a+=x;b+=x;b>=P?b-=P:0;}
^
foo.cpp: In member function 'StringHash::Hash& StringHash::Hash::operator+=(const StringHash::Hash&)':
foo.cpp:42:66: warning: no return statement in function returning non-void [-Wreturn-type]
inline Hash&operator+=(const Hash&x){a+=x.a;b+=x.b;b>=P?b-=P:0;}
^
foo.cpp: In constructor 'StringHash::_init_::_init_()':
foo.cpp:50:47: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
struct _init_{_init_(){po[0]+=1;for(int i=1;i<N;i++)po[i]=po[i-1]*bas;}}_;
~^~
foo.cpp: In function 'void work(int)':
foo.cpp:120:15: warning: narrowing conversion of 's[x]' from 'char' to 'ull {aka long long unsigned int}' inside { } [-Wnarrowing]
if((Hash){s[x],s[x]}==fr[1])s1[1%m]++;
~~~^
foo.cpp:120:20: warning: narrowing conversion of 's[x]' from 'char' to 'uint {aka unsigned int}' inside { } [-Wnarrowing]
if((Hash){s[x],s[x]}==fr[1])s1[1%m]++;
~~~^
foo.cpp:124:28: warning: narrowing conversion of 's[x]' from 'char' to 'ull {aka long long unsigned int}' inside { } [-Wnarrowing]
dfs4(i->to,x,2,(Hash){s[x],s[x]});
~~~^
foo.cpp:124:33: warning: narrowing conversion of 's[x]' from 'char' to 'uint {aka unsigned int}' inside { } [-Wnarrowing]
dfs4(i->to,x,2,(Hash){s[x],s[x]});
~~~^