這道題最難想到就是區間內同時向上旋轉的影響
舉例子說明:
現有字串:aa 可修改區間為[1,2]
因為區間內部是同步變化的,aa(間隔為0) 無論怎麼變化都無法變化為ab(間隔為1)
所以實際的選擇方案的數量是和各個元素之間初始的間隔有關
長度為二的區間有26中不同的間隔方式所以總的方式數目為:26
當是較長的字串和較長的區間時:
如:abcdef 可修改區間為[1,3]
拿出[1,3]的區間 為 bcd
區間內的總的間隔的方案數目為 26 * 26
所以總的方案數為:26 * 26 * 26 * 26
可見只要存在乙個之前區間無法覆蓋的區間,則26的次方數要減一
區間覆蓋其實就比較好理解了 [2,3] 和 [4,5] 這兩個區間各自作用一次的效果等同於 [2.5] 這乙個區間作用一次,所以可以得出的是,相鄰且不相交的區間會自己合併
**如下:
#include
#include
#define ll long long
using
namespace std;
const
int n =
5e7+
10,mod =
1000000007
;int p[n]
,ans;
int find (
int x)
void
merge
(int a,
int b)
ll qpow
(ll a,ll b)
return res;
}int
main
(void
)
cout <<
qpow(26
,ans)
<< endl;
}return0;
}
hdu 1198 並查集應用
其實可能是因為知道是用並查集做的原因啦,一下就看出題意了,明顯是並查集思想,每次輸入地圖中的一塊,檢測這一塊與它頂頭的那塊可不可以相通 如果可以合併集合 同理檢測其與它左邊的那一塊 最後遍歷一遍看有多少個根結點即要多少個水源 下面是 有點亂 include include define m 55 d...
hdu 1198 並查集應用
1 如何把a k塊表示出來,從而使之容易判斷兩塊地是否可以歸併到一起 例如 把a塊劃分如上圖所示,有4個方向,與其他塊有通路的方向標記為1,反之為0,所以a 其他同理 2 如何在map中識別是那一塊,然後根據這一塊找到它的四個方向的0 1情況呢?這裡把a k等效成了0 11 通過座標找到map所在位...
HDU3938 並查集 並查集
先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...